UNICODE_CHARACTER_CLASSフラグ(Unicodeバージョンの定義済み文字クラスとPOSIX文字クラスを有効にする)

Java の正規表現で利用可能なフラグの一つである UNICODE_CHARACTER_CLASS フラグの使い方です。 UNICODE_CHARACTER_CLASS フラグを有効にすると、 Unicode バージョンの定義済み文字クラスと POSIX 文字クラスが利用できるようになります。ここでは Java の正規表現における UNICODE_CHARACTER_CLASS フラグの使い方について解説します。

(Last modified: )

UNICODE_CHARACTER_CLASSフラグを有効にする

UNICODE_CHARACTER_CLASS フラグは Java で利用可能なフラグの一つで、 有効にすることで Unicode バージョンの定義済み文字クラスと POSIX 文字クラスが利用できるようになります。

UNICODE_CHARACTER_CLASS フラグを有効にするには、 compile メソッドの引数に Pattern.UNICODE_CHARACTER_CLASS を指定してパターンオブジェクトを作成してください。

String r = "ABC";
Pattern p = Pattern.compile(r, Pattern.UNICODE_CHARACTER_CLASS);

またはパターンを表す文字列の中に埋め込みフラグの (?U) を記述してください。

String r = "(?U)ABC";
Pattern p = Pattern.compile(r);

Unicode バージョンの定義済み文字クラスと POSIX 文字クラスの一覧は次のとおりです。

\p{Lower}  小文字:\p{IsLowercase}
\p{Upper}  大文字:\p{IsUppercase}
\p{ASCII}  すべてのASCII文字: [\x00-\x7F]
\p{Alpha}  英字:\p{IsAlphabetic}
\p{Digit}  10進数の文字:\p{IsDigit}
\p{Alnum}  英数字:[\p{IsAlphabetic}\p{IsDigit}]
\p{Punct}  句読記号:\p{IsPunctuation}
\p{Graph}  表示できる文字: [^\p{IsWhite_Space}\p{gc=Cc}\p{gc=Cs}\p{gc=Cn}]
\p{Print}  プリント可能文字: [\p{Graph}\p{Blank}&&[^\p{Cntrl}]]
\p{Blank}  空白またはタブ: [\p{IsWhite_Space}&&[^\p{gc=Zl}\p{gc=Zp}\x0a\x0b\x0c\x0d\x85]]
\p{Cntrl}  制御文字: \p{gc=Cc}
\p{XDigit} 16進数字: [\p{gc=Nd}\p{IsHex_Digit}]
\p{Space}  空白文字:\p{IsWhite_Space}
\d         数字: \p{IsDigit}
\D         数字以外: [^\d]
\s         空白文字: \p{IsWhite_Space}
\S         非空白文字: [^\s]
\w         単語構成文字: [\p{Alpha}\p{gc=Mn}\p{gc=Me}\p{gc=Mc}\p{Digit}\p{gc=Pc}\p{IsJoin_Control}]
\W         非単語文字: [^\w]

UNICODE_CHARACTER_CLASSフラグによるマッチングの違い

UNICODE_CHARACTER_CLASS フラグを有効にした場合にどのように変わるのかを確認します。パターンとして A\sB を指定した場合で試してみます。

String r = "A\\sB";
Pattern p = Pattern.compile(r);

デフォルトでは定義済み文字クラスで空白文字とマッチする \s は全角スペースにはマッチしません。

A B
✕ A B

次に UNICODE_CHARACTER_CLASS フラグを有効にしてみます。

String r = "A\\sB";
Pattern p = Pattern.compile(r, Pattern.UNICODE_CHARACTER_CLASS);

Unicode バージョンの定義済み文字クラスで空白文字とマッチする \s は全角スペースにもマッチします。

A BA B
サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample25-1.java という名前で保存します。

import java.util.regex.*;

class JSample25_1{
  public static void main(String[] args){
    String target1 = "A B";
    String target2 = "A B";

    String regex = "A\\sB";
    Pattern p1 = Pattern.compile(regex);

    Matcher m1_1 = p1.matcher(target1);
    System.out.println(target1 + ":" + m1_1.find());
    Matcher m1_2 = p1.matcher(target2);
    System.out.println(target2 + ":" + m1_2.find());

    System.out.println("---- ----");

    Pattern p2 = Pattern.compile(regex, Pattern.UNICODE_CHARACTER_CLASS);

    Matcher m2_1 = p2.matcher(target1);
    System.out.println(target1 + ":" + m2_1.find());
    Matcher m2_2 = p2.matcher(target2);
    System.out.println(target2 + ":" + m2_2.find());
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample25_1.java

その後で、次のように実行してください。

java JSample25_1

UNICODE_CHARACTER_CLASSフラグによるマッチングの違い(1)

UNICODE_CHARACTER_CLASS フラグを有効にすることで、定義済み文字クラスが Unicode 対応のものとなり、空白文字を表す文字クラスの \s が全角スペースにもマッチするようになりました。

-- --

Java の正規表現における UNICODE_CHARACTER_CLASS フラグの使い方について解説しました。

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。