質問

JavaでUnicodeテキストの正規表現を作成しています。ただし、私が使用している特定のスクリプト、デーヴァナーガリー (0900 - 097F) では、単語の境界に問題があります。\b は、スペース文字と同様に扱われるため、依存母音である文字 (093E ~ 094C など) に一致します。

例:次の文字列があるとします。「कमलकम#€लकमकमकमकमकमकमकमです」と、2番目の単語の「म城」は、(スペース文字として認識される)を組み合わせることによって形成されることに注意してください。最後の言葉も同様に。これにより、\b は 'कमाल' の 'ल' を正規表現 \b\w\b と照合することになりますが、これは言語によっては正しくありません。

この例がお役に立てば幸いです。

特定の文字に一致しないことを除いて \b のように動作する正規表現を作成できますか?フィードバックをいただければ幸いです。

役に立ちましたか?

解決

次の正規表現演算子を使用すると、必要なことを達成できるはずです。

(?=X)   X, via zero-width positive lookahead
(?!X)   X, via zero-width negative lookahead
(?<=X)  X, via zero-width positive lookbehind
(?<!X)  X, via zero-width negative lookbehind

(以上、より引用 Java 6 パターン API ドキュメント.)

使用 (?<![foo])(?=[foo]) 代わりに \b 言葉の前に、そして (?<=[foo])(?![foo]) 代わりに \b 単語の後に、「[foo]「」は「単語文字」のセットです

他のヒント

単語の境界に相当するものは (境界が期待していたものではない場合)、次のようになります。

 (?<!=[x-y])(<?=[x-y])...(?<=[x-y])(?![x-y])

なぜなら、「単語の境界」とは「一方の側には文字があり、もう一方の側には文字がない位置」を意味するからです。

したがって、後読みおよび先読み式を使用すると、「単語境界」を分離するときにチェックする独自の文字クラス [x-y] を定義できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top