UNIX_LINESフラグ(\nのみ行末記号として認識される)

広告

Java の正規表現で利用可能なフラグの一つである UNIX_LINES フラグの使い方です。 UNIX_LINES フラグを有効にすると、 \n のみ行末記号として認識されるようになります。ここでは Java の正規表現における UNIX_LINES フラグの使い方について解説します。

UNIX_LINESフラグを有効にする

UNIX_LINES フラグは Java で利用可能なフラグの一つで、有効にすることで \n のみ行末記号として認識されるようになります。(行末記号とは \n などの行の末尾を表す文字です。行末記号の一覧は「行末記号について」を参照されてください)。

UNIX_LINES フラグを有効にするには、 compile メソッドの引数に Pattern.UNIX_LINES を指定してパターンオブジェクトを作成してください。

String r = "ABC$";
Pattern p = Pattern.compile(r, Pattern.UNIX_LINES);

またはパターンを表す文字列の中に埋め込みフラグの (?d) を記述してください。

String r = "(?d)ABC$";
Pattern p = Pattern.compile(r);

UNIX_LINESフラグによるマッチングの違い

UNIX_LINES フラグを有効にした場合にどのように変わるのかを確認します。パターンとして Bye$ を指定した場合で試してみます。今回は MULTILINE フラグを先に有効にしておきます。( MULTILINE フラグについては「MULTILINEフラグ(複数行モードを有効にする)」を参照されてください)。

String r = "Bye$";
Pattern p = Pattern.compile(r, Pattern.MULTILINE);

MULTILINE フラグが有効となっているので、ドル記号($)は文字列の末端だけでなく \n や \r\n などの行末記号ともマッチします。

〇 Thank You!\r\nGood Bye
〇 Good Bye\nThank You!
〇 Good Bye\r\nThank You!

次に UNIX_LINES フラグを有効にしてみます。

String r = "Bye$";
Pattern p = Pattern.compile(r, Pattern.MULTILINE|Pattern.UNIX_LINES;

\n のみ行末記号として認識されるようになり、 \r や \r\n などは行末記号とはみなされなくなります。

〇 Thank You!\r\nGood Bye
〇 Good Bye\nThank You!
✕ Good Bye\r\nThank You!
サンプルコード

それでは簡単なサンプルプログラムを作って試してみます。テキストエディタで次のように記述したあと、 JSample20-1.java という名前で保存します。

import java.util.regex.*;

class JSample20_1{
  public static void main(String[] args){
    String target1 = "Thank You!\r\nGood Bye";
    String target2 = "Good Bye\nThank You!";
    String target3 = "Good Bye\r\nThank You!";

    String regex = "Bye$";
    Pattern p1 = Pattern.compile(regex, Pattern.MULTILINE);

    Matcher m1_1 = p1.matcher​(target1);
    System.out.println(target1 + ":" + m1_1.find());
    Matcher m1_2 = p1.matcher​(target2);
    System.out.println(target2 + ":" + m1_2.find());
    Matcher m1_3 = p1.matcher​(target3);
    System.out.println(target3 + ":" + m1_3.find());

    System.out.println("---- ----");

    Pattern p2 = Pattern.compile(regex, Pattern.MULTILINE|Pattern.UNIX_LINES);

    Matcher m2_1 = p2.matcher​(target1);
    System.out.println(target1 + ":" + m2_1.find());
    Matcher m2_2 = p2.matcher​(target2);
    System.out.println(target2 + ":" + m2_2.find());
    Matcher m2_3 = p2.matcher​(target3);
    System.out.println(target3 + ":" + m2_3.find());
  }
}

コンパイルを行います。

javac -encoding UTF-8 JSample20_1.java

その後で、次のように実行してください。

java JSample20_1

UNIX_LINESフラグによるマッチングの違い(1)

UNIX_LINES フラグを有効にすることで、 \n 以外の行末記号が行末記号として認識されなくなりました。

-- --

Java の正規表現における UNIX_LINES フラグの使い方について解説しました。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。