- Home ›
- Java正規表現の使い方 ›
- オプション修飾子 ›
- HERE
Unixラインモード
compileメソッドの引数としてPattern.UNIX_LINESを指定するか、埋め込みフラグで(?d)を使用すると行末記号として扱われる文字が'¥n'だけになります。
UNIX_LINES public static final int UNIX_LINES
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
サンプルプログラム
では実際に試してみます。
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); } } }
ではコンパイルを行った上で実行してみます。
( Written by Tatsuo Ikura )