LITERALフラグ(パターンの中のメタ文字が特別な意味を持たなくなる)

Java の正規表現で利用可能なフラグの一つである LITERAL フラグの使い方です。 LITERAL フラグを有効にすると、パターンとして記述した文字列は単なる文字列として扱われ、メタ文字などは特別な意味を持たなくなります。ここでは Java の正規表現における LITERAL フラグの使い方について解説します。

(Last modified: )

LITERALフラグを有効にする

LITERAL フラグは Java で利用可能なフラグの一つで、 有効にすることでパターンの中で記述された文字列が特別な意味を持たない単なる文字列として扱われるようになります。例えばパターンとして A.*B と指定した場合、ドット(.)やアスタリスク(*)は特別な意味を持たず A.*B という文字列とだけマッチします。

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

String r = "A.*B";
Pattern p = Pattern.compile(r, Pattern.LITERAL);

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

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

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

String r = "A[0-9]*B";
Pattern p = Pattern.compile(r);

デフォルトでは A で始まり、数値が 0 個以上続き、最後に B が続く文字列とマッチします。よって AB や A1B 、 A246B などとマッチします。

ABA1BA246B
✕ A[0-9]*B

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

String r = "A.*B";
Pattern p = Pattern.compile(r, Pattern.LITERAL);

パターンの中のメタ文字は特別な意味を持たなくなるため、パターンは A[0-9]*B という文字列とだけマッチします。

✕ AB
✕ A1B
✕ A246B
〇 A[0-9]*B
サンプルコード

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

import java.util.regex.*;

class JSample23_1{
  public static void main(String[] args){
    String target1 = "A1B";
    String target2 = "A240B";
    String target3 = "A[0-9]*B";

    String regex = "A[0-9]*B";
    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());
    Matcher m1_3 = p1.matcher(target3);
    System.out.println(target3 + ":" + m1_3.find());

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

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

    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());
    Matcher m2_3 = p2.matcher(target3);
    System.out.println(target3 + ":" + m2_3.find());
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample23_1.java

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

java JSample23_1

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

LITERAL フラグを有効にすることで、パターンの中の文字列が特別な意味を持たずパターンに記述した文字列と同じ値の文字列だけにマッチするようになりました。

-- --

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

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

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