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

JavaのPattern.MULTILINEフィールドとは?例付きでわかりやすく解説

Pattern.MULTILINEは、Javaの正規表現においてマルチライン(複数行)モードを有効にするためのフラグです。

通常、メタ文字「^」と「$」は、入力全体を1つの行として扱います。そのため、入力テキストが何行で構成されていても、これらのメタ文字は入力シーケンス全体の先頭と末尾にのみマッチします。

例1:MULTILINEフラグなしの場合

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

public class MULTILINE_Example {
    public static void main( String args[] ) {
        String input = "2234 This is a sample text\n"
            + "1424 This second 2335 line\n"
            + "This id third 455 line\n"
            + "Welcome to Tutorialspoint\n";
        Pattern pattern = Pattern.compile("^([0-9]+).*");
        Matcher matcher = pattern.matcher(input);
        while(matcher.find()) {
            System.out.println(matcher.group(1));
        }
    }
}

出力結果

2234

このように、compile()メソッドにPattern.MULTILINEを指定しない場合、入力シーケンス全体が1行のテキストとして扱われます。「^」と「$」はそれぞれ入力全体の先頭と末尾にしかマッチしないため、最初の行にある「2234」だけが抽出されました。

例2:MULTILINEフラグありの場合

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

public class MULTILINE_Example {
    public static void main( String args[] ) {
        String input = "2234 This is a sample text\n"
            + "1424 This second 2335 line\n"
            + "This id third 455 line\n"
            + "Welcome to Tutorialspoint\n";
        Pattern pattern = Pattern.compile("^([0-9]+).*", Pattern.MULTILINE);
        Matcher matcher = pattern.matcher(input);
        while(matcher.find()) {
            System.out.println(matcher.group(1));
        }
    }
}

出力結果

2234
1424

Pattern.MULTILINEcompile()メソッドの第2引数として渡すと、正規表現エンジンは入力を複数の行として扱います。その結果、「^」は各行の先頭に、「$」は各行の末尾にもマッチするようになります。

上記の例では、数字で始まる各行(1行目と2行目)の先頭にある数字列「2234」と「1424」がそれぞれ抽出されています。

MULTILINEモードの動作まとめ

  • 「^」(キャレット):デフォルトでは入力全体の先頭のみにマッチ。MULTILINE有効時は、各行(改行文字の直後)の先頭にもマッチします。
  • 「$」(ドル):デフォルトでは入力全体の末尾のみにマッチ。MULTILINE有効時は、各行(改行文字の直前)の末尾にもマッチします。
  • 指定方法Pattern.compile(regex, Pattern.MULTILINE)のようにフラグを渡すほか、正規表現内にインラインフラグ「(?m)」を埋め込むことでも同等の効果が得られます。

ログファイルやCSVなど、複数行のテキストデータから行単位でパターンを抽出したい場合に、Pattern.MULTILINEは非常に便利なフラグです。

  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つのコードポイント)と、基本文字+結合文字(