UNICODE_CASEフラグ(Unicode準拠の文字でも大文字と小文字を区別しない)

Java の正規表現で利用可能なフラグの一つである UNICODE_CASE フラグの使い方です。 UNICODE_CASE フラグを有効にすると、パターンは Unicode 準拠文字であっても大文字と小文字を区別しないようになります(例えば全角文字のAとaを区別しない)。ここでは Java の正規表現における UNICODE_CASE フラグの使い方について解説します。

(Last modified: )

UNICODE_CASEフラグを有効にする

UNICODE_CASE フラグは Java で利用可能なフラグの一つで、 CASE_INSENSITIVE フラグと同時に有効にすることで Unicode 準拠の文字であっても大文字と小文字を区別せずにマッチするかどうかを調べるようになります。

※ CASE_INSENSITIVE フラグについては「CASE_INSENSITIVEフラグ(大文字と小文字を区別しない)」を参照されてください。

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

String r = "apple";
Pattern p = 
  Pattern.compile(r, Pattern.CASE_INSENSITIVE|Pattern.UNICODE_CASE);

またはパターンを表す文字列の中に埋め込みフラグの (?u) を記述してください(同時に CASE_INSENSITIVE フラグの埋め込みフラグである (?i) を記述してください)。

String r = "(?i)(?u)apple";
Pattern p = Pattern.compile(r);

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

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

String r = "book";
Pattern p = Pattern.compile(r);

デフォルトではパターンは大文字と小文字を区別するので book にはマッチしますが Book や BOOK にはマッチしません。

book
✕ Book
✕ BOOK

次に UNICODE_CASE フラグを有効にしてみます(同時に CASE_INSENSITIVE フラグも有効にします)。

String r = "book";
Pattern p = 
  Pattern.compile(r, Pattern.UNICODE_CASE|Pattern.CASE_INSENSITIVE);

パターンは大文字と小文字を区別せずにマッチするかどうか調べるので book の他に Book や BOOK にもマッチします。

bookBookBOOK
サンプルコード

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

import java.util.regex.*;

class JSample22_1{
  public static void main(String[] args){
    String target1 = "book";
    String target2 = "BOOK";

    String regex = "book";
    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.CASE_INSENSITIVE|Pattern.UNICODE_CASE);

    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 JSample22_1.java

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

java JSample22_1

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

UNICODE_CASE フラグを有効にすることで、 Unicode 準拠の文字であっても大文字と小文字が区別されずにマッチするようになりました。

-- --

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

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。