- Home ›
- Java入門 ›
- Java正規表現の使い方
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 B 〇 A 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 フラグを有効にすることで、定義済み文字クラスが Unicode 対応のものとなり、空白文字を表す文字クラスの \s が全角スペースにもマッチするようになりました。
-- --
Java の正規表現における UNICODE_CHARACTER_CLASS フラグの使い方について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。