Escapando caracteres especiais em expressões regulares de Java
Existe algum método em Java ou qualquer biblioteca de código aberto para escapar (não citando) um caractere especial (meta-caractere), para usá-lo como uma expressão regular?
Isso seria muito útil em construir dinamicamente uma expressão regular, sem ter que escapar manualmente de cada caractere individual.
Por exemplo, considere um regex simples como\d+\.\d+
que combina números com um ponto decimal como1.2
, bem como o seguinte código:
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");
}
Não surpreendentemente, a saída produzida pelo código acima é:
Regex 1: \d+\.\d+
Match
Regex 2: \Qd+.d+\E
No match
Isso é,regex1
fósforos1.2
masregex2
(que é "dinamicamente" construído) não (em vez disso, ele corresponde à cadeia literald+.d+
).
Então, existe um método que escape automaticamente de cada meta-caráter regex?
Se houvesse, digamos, uma estáticaescape()
método emjava.util.regex.Pattern
, a saída de
Pattern.escape('.')
seria a string"\."
, mas
Pattern.escape(',')
deve apenas produzir","
, já que não é um meta-caractere. Similarmente,
Pattern.escape('d')
poderia produzir"\d"
, Desde a'd'
é usado para denotar dígitos (embora a fuga possa não fazer sentido neste caso,'d'
poderia significar literal'd'
, que não seria mal entendido pelo interpeter regex para ser outra coisa, como seria o caso com'.'
).