Ucieczka znaków specjalnych w wyrażeniach regularnych Java

Czy istnieje jakaś metoda w Javie lub jakiejkolwiek bibliotece open source do ucieczki (nie cytowania) specjalnego znaku (meta-znaku), aby użyć go jako wyrażenia regularnego?

Byłoby to bardzo przydatne w dynamicznym budowaniu wyrażenia regularnego, bez konieczności ręcznego opuszczania każdego indywidualnego znaku.

Rozważmy na przykład proste wyrażenie regularne\d+\.\d+ który dopasowuje liczby z przecinkiem dziesiętnym jak1.2, a także następujący kod:

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");
}

Nic dziwnego, że wynikiem działania powyższego kodu jest:

Regex 1: \d+\.\d+
    Match
Regex 2: \Qd+.d+\E
    No match

To jest,regex1 mecze1.2 aleregex2 (który jest „dynamicznie” zbudowany) nie (zamiast tego pasuje do literalnego ciągud+.d+).

Czy jest więc metoda, która automatycznie wymyka się każdemu meta-znakowi wyrażenia regularnego?

Gdyby było, powiedzmy, statyczneescape() metoda wjava.util.regex.Pattern, wyjście

Pattern.escape('.')

byłoby sznurkiem"\.", ale

Pattern.escape(',')

powinien po prostu produkować",", ponieważ nie jest to meta-znak. Podobnie,

Pattern.escape('d')

mógł produkować"\d", od'd' służy do oznaczenia cyfr (chociaż ucieczka może nie mieć sensu w tym przypadku, jak'd' może oznaczać dosłowne'd', co nie byłoby źle zrozumiane przez interpeter regex, aby być czymś innym, jak w przypadku'.').

questionAnswers(6)

yourAnswerToTheQuestion