パターン内で空白とコメントを使用

広告

compileメソッドの引数としてPattern.COMMENTSを指定するか、埋め込みフラグで(?x)を使用するとパターンの中で空白とコメントを使用することができるようになります。

パターン内で空白とコメントを使用できるようにします。

このモードでは、空白は無視され、# で始まる埋め込みコメントは行末まで無視されます。

コメントモードは、埋め込みフラグ表現 (?x) を使用して有効にすることもできます。

次のように記述します。

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

埋め込みフラグ表現 (?x)を使って次のようにパターン内に記述することもできます。

String regex = "(?x)pattern";

このモードを有効にするとコメント内に空白や改行を入れても無視されます。

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

"(red|blue)(point|line)"

ではパターンに"(?x)"を付けてパターンを整形します。

"(?x)(red|blue)  (point|line)"

上記のようにパターン内に空白を入れても無視されます。

"(?x) ¥n" + 
"(red|blue) ¥n" +
"(point|line) ¥n"

上記のようにパターン内に改行を入れても無視されます。

Javaの場合は複数行の文字列を定義できないので注意して下さい。

また"#"をパターンの中に記述すると、"#"から行末まではコメントとして扱われます。

"(?x) ¥n" + 
"(red|blue)      # 赤 or 青 ¥n" +
"(point|line)"   # 点 or 線"
#から行末までがコメントなので、最後に改行文字を入れるのを忘れないで下さい。

このように空白や改行、そしてコメントをパターン内に記述することで、複雑なパターンについて解説を加えておくことができます。

サンプルプログラム

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

JSample6_1.java

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

class JSample6_1{
  public static void main(String args[]){
    String str1 = "Watch 3500yen";
    String str2 = "Apple 280yen";
    String str3 = "1350year";

    String regex1 = "(?x)" + 
      "(                          ¥n" +
      "  (                        ¥n" +
      "    ¥¥d   #任意の数字      ¥n" +
      "    +     #1回以上繰り返し ¥n" +
      "  )                        ¥n" +
      "  (                        ¥n" +
      "    yen   #yenで終わる     ¥n" +
      "   )                       ¥n" +
      " )";

    Pattern p1 = Pattern.compile(regex1);

    String regex2 =
      "(                          ¥n" +
      "  (                        ¥n" +
      "    ¥¥d   #任意の数字      ¥n" +
      "    +     #1回以上繰り返し ¥n" +
      "  )                        ¥n" +
      "  (                        ¥n" +
      "    yen   #yenで終わる     ¥n" +
      "   )                       ¥n" +
      " )";

    Pattern p2 = Pattern.compile(regex2, Pattern.COMMENTS);

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

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

    System.out.println("¥nPattern.compile(regex, Pattern.COMMENTS)");
    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);
    }
  }
}

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

p6-1

( Written by Tatsuo Ikura )