web-dev-qa-db-ja.com

Java正規表現の\ wおよび\ bのUnicode相当物?

最新の正規表現の実装の多くは、\w「任意の文字、数字、または接続句読点」としての文字クラスの略記(通常:アンダースコア)。そうすれば、\w+は、helloélèveGOÄ_432 または gefräßig

残念ながら、Javaはそうではありません。Javaでは、\w[A-Za-z0-9_]。これにより、他の問題の中でも、上記のような単語のマッチングが困難になります。

また、\b単語区切り文字は、そうすべきでない場所で一致します。

.NETのような、Unicode対応の\w または \b Javaで? Unicodeに対応するために「書き換え」が必要なショートカットは他にありますか?

123
Tim Pietzcker

\wが機能しないのは本当に残念です。提案されたソリューション\p{Alpha}も私には機能しません。

[\p{L}]はすべてのUnicode文字をキャッチするようです。したがって、\wに相当するUnicodeは[\p{L}\p{Digit}_]でなければなりません。

15
musiKk

Javaでは、_\w_および_\d_はUnicodeに対応していません。 ASCII文字、_[A-Za-z0-9_]_および_[0-9]_のみに一致します。同じことが_\p{Alpha}_と友人にも当てはまります(それらが基づいているPOSIXの「文字クラス」はロケールに依存するはずですが、JavaではASCII文字)。 Unicodeの「Word文字」と一致させる場合は、つづりを入力する必要があります。 _[\pL\p{Mn}\p{Nd}\p{Pc}]_、文字、非スペーシング修飾子(アクセント)、10進数、および接続句読点。

ただし、Javaの_\b_isUnicode-savvy; Character.isLetterOrDigit(ch)を使用し、アクセント付きの文字もチェックしますが、認識する「接続句読点」文字はアンダースコアのみです。 EDIT:サンプルコードを試すと、_""_と_élève"_が本来のように出力されます( ideone.com )でご覧ください。

7
Alan Moore