web-dev-qa-db-ja.com

Java Unicodeをサポートするための正規表現?

AとZを一致させるには、正規表現を使用します。

[A-Za-z]

ユーザーが入力したutf8文字を正規表現に一致させるにはどうすればよいですか?例えば、環保部のような中国語の単語

65
cometta

探しているのはUnicodeプロパティです。

例えば\p{L}は、あらゆる言語からのあらゆる種類の手紙です

したがって、このような中国語の単語に一致する正規表現は次のようになります

\p{L}+

このようなプロパティは多数あります。詳細については、 regular-expressions.info を参照してください

別のオプションは、修飾子を使用することです

Pattern.UNICODE_CHARACTER_CLASS

Java 7では、新しいプロパティPattern.UNICODE_CHARACTER_CLASS事前定義された文字クラスのUnicodeバージョンを有効にします 詳細とリンクについてはこちらの回答をご覧ください

このようなことができます

Pattern p = Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS);

および\wは、すべての言語のすべての文字と数字に一致します(もちろん、_)。

101
stema

NLSサポートに対処し、英語の特殊文字を受け入れないようにするには、次のパターンを使用できます...

[a-zA-Z0-9\u0080-\u9fff] * +

UTFコードポイントリファレンスの場合: http://www.utf8-chartable.de/unicode-utf8-table.pl

コードスニペット:

    String vowels = "అఆఇఈఉఊఋఌఎఏఐఒఓఔౠౡ";
    String consonants = "కఖగఘఙచఛజఝఞటఠడఢణతథదధనపఫబభమయరఱలళవశషసహ";
    String signsAndPunctuations = "కఁకంకఃకాకికీకుకూకృకౄకెకేకైకొకోకౌక్కౕకౖ";
    String symbolsAndNumerals = "౦౧౨౩౪౫౬౭౮౯";
    String engChinesStr = "ABC導字會";


    Pattern ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU = Pattern
            .compile("[a-zA-Z0-9 \\u0c00-\\u0c7f]*+");
    System.out.println(ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU.matcher(vowels)
            .matches());


    Pattern ALPHANUMERIC_AND_SPACE_PATTERN_CHINESE = Pattern
            .compile("[a-zA-Z0-9 \\u4e00-\\u9fff]*+");

    Pattern ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN = Pattern
            .compile("[a-zA-Z0-9 \\u0080-\\u9fff]*+");

    System.out.println(ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN.matcher(engChinesStr)
            .matches());
9

個々の文字を照合するには、リテラルとして、または\u03FB構文を介して、文字クラスに単純に含めることができます。

明らかに、表意文字言語で許可されているすべての文字をリストすることはできません。正規表現でUnicode文字をタイプまたはコードブロックに従って処理するために、 here で定義されている他のさまざまなエスケープがサポートされています。セクション「Unicodeサポート」、特にCharacterクラスおよびUnicode Standard自体への参照を参照してください。

7
Kilian Foth
  • Java正規表現APIはcharタイプで動作します
  • charタイプは暗黙的にUTF-16です
  • uTF-8データがある場合は、入力時にUTF-16にトランスコードする必要があります(まだ行われていない場合)

Unicodeは文字の普遍的なセットであり、UTF-8はそのすべて(制御文字、句読点、記号、文字などを含む)を記述できます。含めるものと除外するものについて、より具体的にする必要があります。 Java正規表現は\p{category}構文を使用して、コードポイントを category で照合します。 Unicode standard カテゴリの リスト の場合。

一連の表意文字の単語を識別して分離する場合は、より洗練されたAPIを検討する必要があります。 BreakIterator タイプから始めます。

3
McDowell