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

JavaのPattern.LITERALフィールドとは?具体例でわかりやすく解説

JavaのPattern.LITERALは、パターンをリテラル(文字通り)として解析することを有効にするフラグです。このモードでは、エスケープシーケンスやメタ文字を含むすべての文字が特別な意味を持たなくなり、単なる文字として扱われます。

通常、入力テキストに対して正規表現「^This」で検索すると、「This」という単語で始まる行に一致します。しかし、LITERALフラグを指定した場合は挙動が変わります。以下の例で確認してみましょう。

例1:LITERALフラグを使った基本的なマッチング

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LITERAL_Example {
    public static void main(String[] args) {
        String input = "This is the first line\n"
            + "This is the second line\n"
            + "^This is the third line";
        // 正規表現「^This」を定義
        String regex = "^This";
        // Patternオブジェクトを作成(LITERALフラグを指定)
        Pattern pattern = Pattern.compile(regex, Pattern.LITERAL);
        // Matcherオブジェクトを作成
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while(matcher.find()) {
            count++;
            System.out.println(matcher.group());
        }
        System.out.println("Number of matches: "+count);
    }
}

出力

^This
Number of matches: 1

リテラルモードでは、メタ文字「^」は行頭を表す特別な意味を持たなくなります。そのため、正規表現「^This」は「This」という単語で始まる行ではなく、「^This」という文字列そのものにのみ一致します。結果として、マッチ数は1となります。

例2:入力内容と照らし合わせて理解する

次の例では、入力テキストをそのまま表示しながら、どの部分がマッチしているのかをより明確に確認できます。

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class LITERAL_Example {
    public static void main(String[] args) {
        String input = "This is the first line\n"
            + "This is the second line\n"
            + "^This is the third line";
        // 正規表現「^This」を定義
        String regex = "^This";
        // Patternオブジェクトを作成(LITERALフラグを指定)
        Pattern pattern = Pattern.compile(regex, Pattern.LITERAL);
        System.out.println("Usually it is printed as: \n"+input);
        // Matcherオブジェクトを作成
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while(matcher.find()) {
            count++;
            System.out.println(matcher.group());
        }
        System.out.println("Number of matches: "+count);
    }
}

出力

Usually it is printed as:
This is the first line
This is the second line
^This is the third line
^This
Number of matches: 1

このように、Pattern.LITERALを使用すると、正規表現の特殊文字を無効化し、パターンを純粋な文字列として扱うことができます。ユーザー入力などをそのまま検索条件として使いたい場合に、意図しない正規表現の解釈を防ぐために非常に便利な機能です。

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