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'.').

questionAnswers(6)

yourAnswerToTheQuestion