Czy istnieje jakakolwiek metoda w Javie lub dowolnej bibliotece open source, która pozwala na uniknięcie (nie cytowanie) znaku specjalnego (meta-znaku), aby użyć go jako wyrażenia regularnego?Wywoływanie znaków specjalnych w wyrażeniach regularnych Java
Byłoby bardzo przydatny w dynamicznym budowaniu wyrażenia regularnego, bez konieczności ręcznego ucieczki każdego znaku.
Na przykład, rozważmy prosty regex jak \d+\.\d+
pasujący liczby z przecinkiem jak 1.2
, jak również 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 moc wytwarzana przez powyższy kod jest:
Regex 1: \d+\.\d+
Match
Regex 2: \Qd+.d+\E
No match
Oznacza to, regex1
mecze 1.2
ale regex2
(która jest „dynamicznie” zbudowany) nie (zamiast dopasowuje dosłowne ciąg d+.d+
).
A więc, czy istnieje metoda, która automatycznie wymyka się każdemu metatrakowi wyrażenia regularnego?
Gdyby były, powiedzmy, statyczny escape()
metodę w java.util.regex.Pattern
, wyjście
Pattern.escape('.')
byłby ciąg "\."
, ale
Pattern.escape(',')
należy po prostu produkować ","
, ponieważ jest nie meta-znak. Podobnie
Pattern.escape('d')
może produkować "\d"
, ponieważ 'd'
jest używany do oznaczenia cyfr (chociaż Cytowanie nie może mieć sens w tym przypadku, jak 'd'
może oznaczać dosłowne 'd'
, który nie będzie niezrozumiany przez interpeter regex być coś innego, jak byłoby w przypadku '.'
).
Jak taki sposób by określić różnicę beween od 'd' oznaczało jako znak meta i "d" w tekście do dopasowania? ('quote (" d + Dollars? ")' stałoby się '' \\ d + \\ Dollar \\ s? "' w trywialnej metodzie cytowania.) – rsp
Prawidłowo, właśnie dlatego proszę o metodę, która mogłaby uciec indywidualne postacie! :-) – PNS
Aby uciec od pojedynczych znaków, możesz bawić się dopasowując granicę słowa, coś w stylu: 's/\ b ([dswDSW]) \ b/\\ 1/g;' – rsp