パターンのリテラル構文解析を有効にする

広告

compileメソッドの引数としてPattern.LITERALを指定するとパターンのリテラル構文解析を有効になります。

パターンのリテラル構文解析を有効にします。

このフラグが指定されている場合、パターンを指定する入力文字列は、リテラル文字のシーケンス
として処理されます。入力シーケンス内のメタキャラクタまたはエスケープシーケンスに、特別な
意味はありません。

CASE_INSENSITIVE および UNICODE_CASE フラグをこのフラグとともに使用すると、マッチングに対
する影響が維持されます。ほかのフラグは不要になります。

リテラル構文解析を有効にするための埋め込みフラグ文字はありません。

次のように記述します。

String regex = "pattern";
Pattern p = Pattern.compile(regex, Pattern.LITERAL);

このオプション修飾子を使用するとパターン内のメタ文字などは特別な意味を持たなくなります。

具体的な例で考えてみます。次のようなパターンを定義しました。

"¥d+"

数字が1文字以上続く場合にマッチします。ターゲット文字列毎に上記のパターンにマッチするかどうかの一覧が下記となります。

○ 100
○ old20
× ¥d+

今度は同じパターンでPattern.LITERALを指定してみます。"¥d"や"+"は特別な意味を持たなくなるため、マッチするのは文字列としての"¥d+"だけです。

× 100
× old20
○ ¥d+

サンプルプログラム

では実際に試してみます。

JSample8_1.java

import java.util.regex.Pattern;
import java.util.regex.Matcher;

class JSample8_1{
  public static void main(String args[]){
    String str1 = "100";
    String str2 = "old20";
    String str3 = "¥¥d+";

    String regex1 = "¥¥d+";
    Pattern p1 = Pattern.compile(regex1);

    String regex2 = "¥¥d+";
    Pattern p2 = Pattern.compile(regex2, Pattern.LITERAL);

    System.out.println("パターン : " + regex1);

    check(p1, str1);
    check(p1, str2);
    check(p1, str3);

    System.out.println("¥nPattern.compile(regex, Pattern.LITERAL)");
    System.out.println("パターン : " + regex2);

    check(p2, str1);
    check(p2, str2);
    check(p2, str3);
  }

  private static void check(Pattern p, String target){
    Matcher m = p.matcher(target);

    if (m.find()){
      System.out.println("○ " + target);
    }else{
      System.out.println("× " + target);
    }
  }
}

ではコンパイルを行った上で実行してみます。

p8-1

( Written by Tatsuo Ikura )