DOTALLフラグ(ドット(.)が行末記号とマッチする)

広告

Java の正規表現で利用可能なフラグの一つである DOTALL フラグの使い方です。 DOTALL フラグを有効にすると、メタ文字であるドット(.)が行末記号にもマッチするようになります。ここでは Java の正規表現における DOTALL フラグの使い方について解説します。

DOTALLフラグを有効にする

DOTALL フラグは Java で利用可能なフラグの一つで、有効にすることでメタ文字であるドット(.)が行末記号にもマッチするようになります。(行末記号とは \n などの行の末尾を表す文字です。行末記号の一覧は「行末記号について」を参照されてください)。

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

String r = "A.*B";
Pattern p = Pattern.compile(r, Pattern.DOTALL);

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

String r = "(?s)A.*B";
Pattern p = Pattern.compile(r);

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

DOTALL フラグを有効にした場合にどのように変わるのかを確認します。パターンとして <p>.*</p> を指定した場合で試してみます。

String r = "<p>.*</p>";
Pattern p = Pattern.compile(r);

デフォルトではメタ文字のドット(.)は行末記号にマッチしないため、 <p> と </p> の間に \n などの行末記号が含まれている場合はマッチしません。

〇 AAA<p>BBBCCC</p>DDD
✕ AAA<p>BBB\nCCC</p>DDD

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

String r = "<p>.*</p>";
Pattern p = Pattern.compile(r, Pattern.DOTALL);

ドット(.)は行末記号にもマッチするようになります。

〇 AAA<p>BBBCCC</p>DDD
〇 AAA<p>BBB\nCCC</p>DDD
サンプルコード

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

import java.util.regex.*;

class JSample19_1{
  public static void main(String[] args){
    String target1 = "<p>Lemon is yellow.Strawberry is red</p>";
    String target2 = "<p>Lemon is yellow.\nStrawberry is red</p>";

    String regex = "<p>.*</p>";
    Pattern p1 = Pattern.compile(regex);

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

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

    Pattern p2 = Pattern.compile(regex, Pattern.DOTALL);

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

コンパイルを行います。

javac -encoding UTF-8 JSample19_1.java

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

java JSample19_1

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

DOTALL フラグを有効にすることで、ドット(.)が行末記号にもマッチするようになりました。

-- --

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

( Written by Tatsuo Ikura )

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

著者 / TATSUO IKURA

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