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

Javaの正規表現における\Qメタ文字の使い方|メタ文字をエスケープしてリテラルとして扱う方法

Javaの正規表現では、\Q から \E までの間に挟まれたすべての文字が「引用符で囲まれた」状態になり、メタ文字としての特別な意味が無効化されます。つまり、正規表現内のメタ文字を \Q\E で囲むことで、それらを通常の文字(リテラル)として扱えるようになります。

例えば、[aeiou] という正規表現は文字クラスとして解釈され、「母音(a・e・i・o・u)を含む文字列」にマッチします。しかし、これを \Q[aeiou]\E のように記述すると、文字クラスとしての意味は失われ、入力文字列中に「[aeiou]」という文字列そのものが含まれている場合にのみマッチするようになります。

通常の正規表現でのマッチ例

まず、[aeiou] をそのまま使った例を見てみましょう。入力文字列に母音が含まれていればマッチします。

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

public class SampleProgram {
    public static void main(String args[]) {
        String regex = "[aeiou]";
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input string: ");
        String input = sc.nextLine();
        // Patternオブジェクトの生成
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        if (matcher.find()) {
            System.out.println("Match occurred");
        } else {
            System.out.println("Match not occurred");
        }
    }
}

実行結果

Enter input string:
sample
Match occurred

「sample」という文字列には母音 a・e が含まれているため、マッチが発生しています。

\Qと\Eで囲んだ場合の挙動

次に、同じ表現を \Q[aeiou]\E として使用した例です。この場合、角括弧や文字クラスの構文はすべて無効化され、単なる文字列「[aeiou]」との一致を検索します。

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

public class SampleProgram {
    public static void main(String args[]) {
        String regex = "\\Q[aeiou]\\E";
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input string: ");
        String input = sc.nextLine();
        // Patternオブジェクトの生成
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        if (matcher.find()) {
            System.out.println("Match occurred");
        } else {
            System.out.println("Match not occurred");
        }
    }
}

実行結果1:母音のみを含む文字列の場合

Enter input string:
sample
Match not occurred

「sample」には母音が含まれていますが、文字列「[aeiou]」そのものは含まれていないため、今度はマッチしません。

実行結果2:「[aeiou]」という文字列を含む場合

Enter input string:
The letters [aeiou] are vowels in English alphabet
Match occurred

入力文字列の中に「[aeiou]」という一連の文字がそのまま存在するため、マッチが発生します。

ポイントまとめ

  • \Q\E の間にある文字は、正規表現のメタ文字(.*+[] など)であっても、すべて通常の文字として扱われます。
  • ユーザー入力などを正規表現パターンとして安全に埋め込みたい場合に特に有効です。
  • Javaでは、同様の目的で Pattern.quote(String) メソッドを使うこともできます。このメソッドは、引数の文字列を自動的に \Q\E で囲んだパターン文字列を返してくれます。

このように \Q\E を活用することで、メタ文字の意図しない解釈を防ぎ、文字列をリテラルとして確実に検索できるようになります。

  1. Javaの正規表現における$(ドル)メタ文字の使い方

    正規表現におけるサブ表現(メタ文字)「$」は、行の末尾に一致します。パターンの最後に「$」を置くことで、指定した文字列で終わるテキストだけをマッチさせることができます。なお、デフォルトでは「$」は入力全体の末尾に一致しますが、Pattern.MULTILINEフラグを有効にすると、行区切り文字(改行など)の直前にも一致するようになります。例1:行末の一致を確認する次のJavaプログラムでは、「Tutorialspoint」という文字列で終わる入力に対して、正規表現「Tutorialspoint$」が何回一致するかを数えています。import java.util.regex.Matcher; i

  2. Java正規表現のメタ文字「^(キャレット)」の使い方を解説

    正規表現におけるサブ式(メタ文字)「^」は、行の先頭にマッチします。この記号を正規表現の中で使用すると、入力文字列の中でその後に続くパターンが行頭から始まる場合に一致とみなされます。 例1:行頭のパターンにマッチするか確認する 次のサンプルコードでは、入力文字列が「Hi how are you」というフレーズで始まっているかどうかを「^」を使って判定しています。 import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexExample { public static void m