Unixラインモード

広告

compileメソッドの引数としてPattern.UNIX_LINESを指定するか、埋め込みフラグで(?d)を使用すると行末記号として扱われる文字が'¥n'だけになります。

Unix ラインモードを有効にします。

このモードでは、'¥n' 行末記号以外は、.、^、$ の動作で認識されません。

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

次のように記述します。

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

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

String regex = "(?d)pattern";

行末記号」にも記載していますが、行末記号は'¥n'の他に"¥r¥n"や'¥r'などがあります。Unixラインモードを有効にすると行末記号として認識さえのが'¥n'に限定されます。

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

"(?m)color$"

複数行モードにしてありますので、メタ文字の"$"は行末記号に直前にマッチします。

○ color
○ color¥nalpha
○ color¥r¥nalpha

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

"(?m)(?d)color$"

"(?d)"が付けられると行末記号として扱われるのが"¥n"だけになります。その結果、"¥n"は行末記号して認識されますが"¥r¥n"は行末記号として認識されなくなるので、メタ文字の"$"が"¥r¥n"の直前にマッチしなくなります。ターゲット文字列毎に上記のパターンにマッチするかどうかの一覧が下記となります。

○ color
○ color¥nalpha
× color¥r¥nalpha

サンプルプログラム

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

JSample5_1.java

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

class JSample5_1{
  public static void main(String args[]){
    String str1 = "abc";
    String str2 = "abc¥ndef";
    String str3 = "abc¥r¥ndef";

    String regex1 = "(?m)abc$";
    Pattern p1 = Pattern.compile(regex1);

    String regex2 = "(?m)(?d)abc$";
    Pattern p2 = Pattern.compile(regex2);

    String regex3 = "abc$";
    Pattern p3 = Pattern.compile(regex3, Pattern.MULTILINE | Pattern.UNIX_LINES);

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

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

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

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

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

    check(p3, str1);
    check(p3, str2);
    check(p3, 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);
    }
  }
}

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

p5-1

( Written by Tatsuo Ikura )