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

広告

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

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 )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。