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

【Java】正規表現の\Eメタ文字とは?\Qと組み合わせたエスケープ方法を解説

\Eメタ文字の基本的な役割

正規表現におけるサブ表現(メタ文字)「\E」は、\Qによって開始された引用(クォート)を終了させる役割を持っています。つまり、\Qと\Eの間にメタ文字を挟むことで、正規表現内のメタ文字をエスケープ(特殊な意味の無効化)することができます。

例えば、正規表現 [aeiou] は、母音(a・e・i・o・u)を含む文字列にマッチします。

サンプルコード1:通常の正規表現の場合

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」という文字列には母音が含まれているため、パターンにマッチします。

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

しかし、同じ表現を\Q[aeiou]\Eのように\Qと\Eで囲むと、挙動が変化します。この場合、指定された文字列の中に「[aeiou]」という文字の並びそのものが存在するかどうかを判定するようになります。

つまり、\Qと\Eの間にあるメタ文字は特別な意味を失い、単なる通常の文字(リテラル)として扱われるのです。

サンプルコード2:\Qと\Eを使用した場合

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:間に挟まれたすべての文字をリテラル(通常の文字)として扱う
  • \E:\Qで開始された引用を終了させる

このように、\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