CANON_EQフラグ(パターンと対象の文字がUnicode正規等価であればマッチする)

Java の正規表現で利用可能なフラグの一つである CANON_EQ フラグの使い方です。 CANON_EQ フラグを有効にすると、パターンとして記述した文字と対象となる文字が Unicode の正規等価であればマッチするようになります。ここでは Java の正規表現における CANON_EQ フラグの使い方について解説します。

(Last modified: )

CANON_EQフラグを有効にする

CANON_EQ フラグは Java で利用可能なフラグの一つで、 有効にすることでパターンの中で指定した文字と対象となる文字が Unicode 正規等価であった場合はマッチするようになります。正規等価について正直正確に理解できているわけではありませんが、例えば「て+濁音の合成文字」と「で」がマッチするようになります。

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

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

CANON_EQ フラグの場合には埋め込みフラグは用意されていません。

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

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

String r = "では";
Pattern p = Pattern.compile(r);

デフォルトでは同じ "では" とはマッチしますが、 "て"+濁音(\u3099)+"は" とはマッチしません。

では
✕ て\u3099は

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

String r = "では";
Pattern p = Pattern.compile(r, Pattern.CANON_EQ);

パターンの中の "で" と対象の文字列の中の "て"+濁音(\u3099) は正規等価のため、パターンは "て\u3099は" ともマッチします。

では✕ て\u3099は
サンプルコード

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

import java.util.regex.*;

class JSample24_1{
  public static void main(String[] args){
    String target = "て\u3099は";

    String regex = "では";
    Pattern p1 = Pattern.compile(regex);

    Matcher m1 = p1.matcher(target);
    System.out.println(target + ":" + m1.find());

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

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

    Matcher m2 = p2.matcher(target);
    System.out.println(target + ":" + m2.find());
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample24_1.java

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

java JSample24_1

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

CANON_EQ フラグを有効にすることで、パターンの中の文字っと対象の文字が正規等価の場合はマッチするようになりました。

-- --

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

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

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