Javaまたはオープンソースライブラリに、特殊文字(メタ文字)を正規表現として使用するためにエスケープ(引用符で囲まない)する方法はありますか?
これは、個々の文字を手動でエスケープすることなく、正規表現を動的に作成するのに非常に便利です。
たとえば、次のコードと同様に、の\d+\.\d+
ような小数点のある数値に一致するような単純な正規表現について考えてみます。1.2
String digit = "d";
String point = ".";
String regex1 = "\\d+\\.\\d+";
String regex2 = Pattern.quote(digit + "+" + point + digit + "+");
Pattern numbers1 = Pattern.compile(regex1);
Pattern numbers2 = Pattern.compile(regex2);
System.out.println("Regex 1: " + regex1);
if (numbers1.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
System.out.println("Regex 2: " + regex2);
if (numbers2.matcher("1.2").matches()) {
System.out.println("\tMatch");
} else {
System.out.println("\tNo match");
}
当然のことながら、上記のコードによって生成される出力は次のとおりです。
Regex 1: \d+\.\d+
Match
Regex 2: \Qd+.d+\E
No match
つまり、regex1
一致し1.2
ますがregex2
(「動的に」構築されます)、一致しません(代わりに、リテラル文字列と一致しますd+.d+
)。
それで、各正規表現メタ文字を自動的にエスケープする方法はありますか?
たとえば、に静的escape()
メソッドがあったjava.util.regex.Pattern
場合、の出力は
Pattern.escape('.')
文字列"\."
になりますが、
Pattern.escape(',')
","
メタ文字ではないため、を生成する必要があります。同様に、
Pattern.escape('d')
"\d"
は数字を表すために使用されるため、を生成でき'd'
ます(ただし、この場合、エスケープは意味をなさない場合があります。これは、正規表現の介入者が他の何かと誤解しない'd'
文字通りを意味する場合があります)。'd'
'.'