2012-02-09 3 views
6

「Aiavärav」と言います。式\w+はこの単語を捕捉するはずですが、文字「ä」は単語を半分にカットします。 "Aiavärav"の代わりに、 "Aia"を得る。これらの非ASCII文字を含む単語の正しい正規表現は何ですか?Javaの正規表現では他の言語の文字を単語文字( wなど)として認識しません

Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS) 

またはパターンで(?U)を埋め込む:あなたはUNICODE_CHARACTER_CLASSフラグを指定しない限り

+0

単語をコピーして文字列に入れると、正規表現\ w +を使用して正しく単語を取得できます。私はC#でテストしています。 –

+0

Javaを使用しています。また、私はmyregextester.comでテストしたが、それでも単語全体を認識しません。 – jyriand

+0

[Unicode letters](http://www.regular-expressions.info/unicode.html)を見たいかもしれませんか? '\ p {L} + ' – Wiseguy

答えて

12

the documentationによると、\wだけ[a-zA-Z_0-9]と一致する

Pattern.compile("(?U)\\w+") 

は、いずれかがJDK 1.7が必要です(つまり、 Java 7)。 (; [a-zA-Z]のようにではなく、ASCII固有の「手紙」)と\p{N}(「番号」、あなたは、Java 7を持っていない場合

、あなたは\p{L}を使用してUnicodeに\wを一般化することができ[0-9]のようではなく、ASCII- )特定:

Pattern.compile("[\\p{L}_\\p{N}]+") 

しかし、それは多分あなたは(プログラミング言語の意味ではなく)普通の感覚では、実際の言葉を探しているように聞こえる、と数字とアンダースコアをサポートする必要はありません。 ?その場合は、あなただけの\p{L}を使用することができます。

Pattern.compile("\\p{L}+") 

(ちなみに、中括弧は、実際に—あなたの代わりに\p{N} —の代わりにp{L}\pN\pLを書くことができますが、人々は通常、とにかくそれらを含める、理由はオプションです

+0

埋め込み(?U) "...によってパフォーマンスが低下する可能性があることに注意してください。" http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html#UNICODE_CHARACTER_CLASS – reallynice

+0

@niconic:リンク先のドキュメントは、実際には 'UNICODE_CHARACTER_CLASS'を参照していますが、 (?U) 'でも、いずれの方法でも、高価な部分はUnicode文字のプロパティ(ASCII文字のグループと比較して)を使って一致していると思います。これは正確にOPがやろうとしているものなので、実際には彼のケースでは「パフォーマンスペナルティ」ではなく、おそらく彼が取るかもしれないアプローチにも適用されます。 – ruakh

+0

私は間違っているかもしれませんが、UNICODE_CHARACTER_CLASS'リンクでは、 'UNICODE_CHARACTER_CLASSモードも埋め込みフラグ式(?U)で有効にできます。私は同じことを話していると思う。私は何かを誤解していますか? – reallynice

関連する問題