おはようございます。C/C++ PCRE正規表現を使用して、ドイツ語の文字列「DAStausendschöneJungfräuleintausendschçne」を一致させようとしてい"\x{00F6}.*\x{00E4}.*\x{00E7}"
ます。PCRE正規表現は、バイト位置14および43から1回だけ一致します。PCRE正規表現は正しいですか、それとも修正する必要がありますか?ありがとうございました。
2 に答える
返されたデータを誤解しています。
PCRE は、一致の開始位置と終了位置を返します。それぞれのケースで 1 回だけ一致しましたが、一致には、一致した文字列全体が含まれます.*
。
したがって、入力文字列では、次の部分が一致しています。
DAS tausendschöne Jungfräulein tausendschçne
..............mmmmmmmmmmmmmmmmmmmmmmmmmmmm..
または同等に、次のバイトと一致しています。
0 1 2 3 4 4
01234567890123456789012345678901234567890123456789
DAS tausendschöne Jungfräulein tausendschçne
..............mmmmmmmmmmmmmmmmmmmmmmmmmmmmmm...
正しく動作しています。http://www.pcre.org/pcre.txtから:
一致が成功すると、キャプチャされた部分文字列に関する情報が、ovector の先頭から最大でその長さの 3 分の 2 までの整数のペアで返されます。各ペアの最初の要素は部分文字列の最初の文字のバイト オフセットに設定され、2 番目の要素は部分文字列の末尾の後の最初の文字のバイト オフセットに設定されます。注: これらの値は、UTF-8 モードであっても、常にバイト オフセットです。文字数ではありません。
整数の最初のペア ovector[0] と ovector[1] は、パターン全体と一致する対象文字列の部分を識別します。次のペアは、最初のキャプチャ サブパターンに使用されます。
こんにちは。正しい PCRE 正規表現を発見しました。(?=.+(\x{00F6})){1}(?=.+(\x{00E4})){1}(?=.+(\x{00E7})){1}
これは、バイト位置 (14,16)、(25,27)、および (42,43) で DAS tausendschöne Jungfräulein ausendschçne に一致します。よろしく、フランク