複数行モード

広告

compileメソッドの引数としてPattern.MULTILINEを指定するか、埋め込みフラグで(?m)を使用すると行末記号が有効となりメタ文字の"^"が行頭にマッチし、メタ文字の"$"行末記号の直前にもマッチするようになります。

複数行モードを有効にします。

複数行モードでは、表現 ^ と $ は、それぞれ行末記号または入力シーケンスの末尾の直後または直
前にマッチします。デフォルトでは、これらの表現は入力シーケンス全体の先頭と末尾にだけマッチ
します。

複数行モードは、埋め込みフラグ表現 (?m) を使用して有効にすることもできます。

次のように記述します。

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

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

String regex = "(?m)pattern";

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

"^B"

ターゲット文字列毎に上記のパターンにマッチするかどうかの一覧が下記となります。

○ Book
× Movie¥nBook

では先ほどのパターンに"(?m)"を付けます。

"(?m)^B"

"(?m)"が付けられると行末記号を無視しなくなるため、メタ文字の"^"は文の先頭だけでなく行頭にもマッチします。またメタ文字の"$"は文の最後だけではなく行末文字の直前にマッチするようになります。ターゲット文字列毎に上記のパターンにマッチするかどうかの一覧が下記となります。

○ Book
○ Movie¥nBook

サンプルプログラム

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

JSample3_1.java

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

class JSample3_1{
  public static void main(String args[]){
    String str1 = "Book";
    String str2 = "Movie¥nBook";

    String regex1 = "^B";
    Pattern p1 = Pattern.compile(regex1);

    String regex2 = "(?m)^B";
    Pattern p2 = Pattern.compile(regex2);

    String regex3 = "^B";
    Pattern p3 = Pattern.compile(regex3, Pattern.MULTILINE);

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

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

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

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

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

    check(p3, str1);
    check(p3, str2);
  }

  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);
    }
  }
}

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

p3-1

( Written by Tatsuo Ikura )