これはちょっと難しい質問ですが、可能です。まず、ユニコード文字列を4つの形式のいずれかに正規化する必要があります。正規化に関する情報はhereであり、正規化された文字例のマップはhereであり、正規化された文字の良いグラフはhereです。基本的に、正規化すると、発音区別記号を扱うときに、すべての文字が同じ形式になるようにします。 Golangはこれを大いにサポートしており、ほとんどすべての言語にはこれを行うためのライブラリが含まれています。
私の例では、文字列を「正規化フォームD」(NFD)とutf32に変換するので、すべてのユニコード文字は4バイトのコードポイントになります。
墓地アクセントのすべての二重引用符は、文字の隣に0x0300を持っています。だから、....\x00\x00\x03\x00
のasciiモード(Unicodeモードではない)で正規表現検索を行うことができます。そこから、あなたが使用しているエンコーディングに応じて異なる方法で行うことができるruneの場所を抽出する必要があります。
したがって、4の部門に着陸すれば、その有効な文字がわかります。
これ以外に、これを行うための公式のperl文字グループはありません。
例として、Perlコード:
use Encode;
use Unicode::Normalize;
$StartUTF8='xàaâèaê';
$PerlEncoded=decode('utf8', $StartUTF8);
$PerlNormalized=NFD($PerlEncoded);
$UTF32Normalized=encode('utf32', $PerlNormalized);
while($UTF32Normalized =~ /(....\x00\x00\x03\x00)/gs) {
$Pos=pos($UTF32Normalized)-8;
if($Pos%4==0) {
print("$Pos\n");
}
}
しかし、この時点で、あなたにもちょうど文字の上にループのためにやっているかもしれません: -
\私はまた、位置を必要とせずにマッチングを試みました// cを使ってテストしますが、なんらかの理由で動作しません。
/^(?:....)*?(....\x00\x00\x03\x00)/gcs
それが結合文字の場合は、[Unicodeコードポイントのリストを生成する]ことで可能かもしれません(http://stackoverflow.com/questions/17051732/algorithm-to-check-for-combining-characters-in-unicode )。 – kba
一文字の文字クラスを信頼できず動作させないようにする。これは、文字列NFC(正規化フォーム構成)に一致する事前合成された文字に対してのみ機能します。 2つ以上の発音区別符を持つほとんどの文字には、事前合成された文字はありません。私。それらは複数のコードポイント(Unicodeスピーチでは文字)で構成されています。それをコピーして文字クラスに貼り付けると、区別記号は引き続き1文字になり、ターゲット文字列内の同じ発音区別記号に一致します。 –