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