Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java PatternクラスのDOTALLフィールドとは?具体例でわかりやすく解説

Javaの Pattern クラスには、正規表現の動作を制御するためのさまざまなフラグが用意されています。そのひとつである DOTALL フィールドを有効にすると、いわゆる「dotallモード」がオンになります。

デフォルトの状態では、正規表現の「.」(ドット)というメタ文字は、改行などの行末記号を除くすべての文字に一致します。しかし、DOTALLモードを有効にすると、「.」は行末記号も含めたすべての文字に一致するようになります。

例1:通常モードでの「.」の挙動

まず、フラグを指定せずにパターンをコンパイルした場合の動作を見てみましょう。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DOTALL_Example {
    public static void main( String args[] ) {
        String regex = ".";
        String input = "this is a sample \nthis is second line";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        int count =0;
        while(matcher.find()) {
            count++;
            System.out.print(matcher.group());
        }
        System.out.println();
        System.out.println("Number of new line characters: \n"+count);
    }
}

実行結果

this is a sample this is second line
Number of new line characters:
36

この例では、入力文字列中の改行文字(\n)は「.」のマッチ対象から除外されるため、出力結果では2行がつながって表示され、マッチした文字数は36となっています。

DOTALLモードの意味

DOTALLモードでは、改行文字を含むすべての文字がマッチ対象になります。言い換えると、compile() メソッドの第2引数としてこのフラグ値を渡すことで、「.」メタ文字が行末記号を含むすべての文字に一致するようになります。

例2:DOTALLフラグを使用した場合

次に、Pattern.DOTALL を指定してコンパイルした場合の動作を確認します。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class DOTALL_Example {
    public static void main( String args[] ) {
        String regex = ".";
        String input = "this is a sample \nthis is second line";
        Pattern pattern = Pattern.compile(regex, Pattern.DOTALL);
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while(matcher.find()) {
            count++;
            System.out.print(matcher.group());
        }
        System.out.println();
        System.out.println("Number of new line characters: \n"+count);
    }
}

実行結果

this is a sample
this is second line
Number of new line characters:
37

今度は改行文字自体も「.」にマッチして出力されるため、2行に分かれたまま表示され、マッチした文字数は37(改行1文字ぶん増加)となっています。

まとめ

  • デフォルトでは「.」は改行などの行末記号にマッチしない。
  • Pattern.DOTALL フラグを compile() メソッドに渡すと、dotallモードが有効になる。
  • dotallモードでは「.」が改行文字を含むすべての文字にマッチするようになる。
  • 複数行にまたがるテキストを1つのパターンで扱いたい場合に便利。
  1. JavaのPattern.COMMENTSフィールドとは?使い方を実例付きで解説

    JavaのPatternクラスが持つCOMMENTSフィールドは、正規表現パターンの中に空白文字やコメントを自由に記述できるようにするフラグです。このフラグをcompile()メソッドの第2引数として指定すると、パターン内の空白文字や、#記号で始まるコメント部分はすべて無視されてコンパイルされます。 複雑な正規表現を扱う場合、そのままでは読みにくくなりがちですが、COMMENTSフラグを活用すれば、各部分に説明用のコメントを付けたり、改行やインデントを使って整形したりできるため、可読性と保守性が大きく向上します。なお、このフラグは正規表現内に(?x)を埋め込む方法でも同等の効果が得られます。

  2. 【Java入門】Pattern.CANON_EQフラグの使い方をサンプルコードで解説

    JavaのPatternクラスには、正規表現のマッチング動作を制御するためのさまざまなフラグが用意されています。そのひとつであるCANON_EQフィールドは、「正規化等価(canonical equivalence)」に基づいて文字を照合するためのフラグです。このフラグをcompile()メソッドに指定すると、2つの文字は完全な正準分解(canonical decomposition)の結果が等しい場合に限りマッチするとみなされます。ここでいう正準分解とは、Unicodeのテキスト正規化形式のひとつです。たとえば、アクセント記号付きの合成済み文字(1つのコードポイント)と、基本文字+結合文字(