Jak uwolnić tekst dla wyrażenia regularnego w Javie
Czy Java ma wbudowany sposób ucieczki dowolnego tekstu, aby mógł być zawarty w wyrażeniu regularnym? Na przykład, jeśli moi użytkownicy wprowadzą "$5", chciałbym dopasować to dokładnie, a nie " 5 " Po zakończeniu wprowadzania.
8 answers
Od Java 1.5, TAK :
Pattern.quote("$5");
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-04 16:29:34
Różnica między Pattern.quote
oraz Matcher.quoteReplacement
nie było dla mnie jasne, zanim zobaczyłem następujący przykład
s.replaceFirst(Pattern.quote("text to replace"),
Matcher.quoteReplacement("replacement text"));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-25 23:00:51
Może być za późno, aby odpowiedzieć, ale możesz również użyć Pattern.LITERAL
, która zignorowałaby wszystkie znaki specjalne podczas formatowania:
Pattern.compile(textToFormat, Pattern.LITERAL);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-17 11:09:41
Myślę, że szukasz \Q$5\E
. Zobacz też Pattern.quote(s)
wprowadzone w Java5.
Zobacz wzór javadoc po szczegóły.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-25 08:26:25
Po pierwsze, Jeśli
- używasz replaceAll () Nie używasz Matchera.quoteReplacement ()
- tekst do zastąpienia zawiera $1
To nie umieści 1 na końcu. Będzie patrzeć na wyszukiwanie regex dla pierwszej pasującej grupy i sub, że w. To właśnie oznacza $1, $2 lub $3 w tekście zastępczym: dopasowywanie grup z wzorca wyszukiwania.
Często podłączam długie ciągi tekstu .pliki właściwości, następnie generować tematy wiadomości e-mail i ciała z nich. Rzeczywiście, wydaje się to być domyślnym sposobem wykonywania i18n w ramach Spring. Umieszczam znaczniki XML jako symbole zastępcze w łańcuchach znaków i używam replaceAll (), aby zastąpić znaczniki XML wartościami w czasie wykonywania.
Natknąłem się na problem, w którym użytkownik wpisuje liczbę dolarów i centów ze znakiem dolara. replaceAll (), a w stracktrace pojawia się:java.lang.IndexOutOfBoundsException: No group 3
at java.util.regex.Matcher.start(Matcher.java:374)
at java.util.regex.Matcher.appendReplacement(Matcher.java:748)
at java.util.regex.Matcher.replaceAll(Matcher.java:823)
at java.lang.String.replaceAll(String.java:2201)
W tym przypadku, użytkownik wpisał" $3 " gdzieś w swoim wejściu i zamienił() poszedłem szukać w wyszukiwaniu regex dla trzeciej pasującej grupy, nie znalazłem żadnej i wymiotował.
Podane:
// "msg" is a string from a .properties file, containing "<userInput />" among other tags
// "userInput" is a String containing the user's input
Zastąpienie
msg = msg.replaceAll("<userInput \\/>", userInput);
Z
msg = msg.replaceAll("<userInput \\/>", Matcher.quoteReplacement(userInput));
Rozwiązałem problem. Użytkownik mógł bez problemu umieszczać dowolne znaki, w tym znaki dolara. Zachowywał się dokładnie tak, jak można się było spodziewać.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-14 15:00:27
Aby mieć chroniony wzorzec, można zamienić wszystkie symbole na"\\\\", z wyjątkiem cyfr i liter. A potem możesz umieścić w tym chronionym wzorze swoje specjalne symbole, aby ten wzór działał nie jak głupi cytowany tekst, ale naprawdę jak patten, ale twój własny. Bez specjalnych symboli użytkownika.
public class Test {
public static void main(String[] args) {
String str = "y z (111)";
String p1 = "x x (111)";
String p2 = ".* .* \\(111\\)";
p1 = escapeRE(p1);
p1 = p1.replace("x", ".*");
System.out.println( p1 + "-->" + str.matches(p1) );
//.*\ .*\ \(111\)-->true
System.out.println( p2 + "-->" + str.matches(p2) );
//.* .* \(111\)-->true
}
public static String escapeRE(String str) {
//Pattern escaper = Pattern.compile("([^a-zA-z0-9])");
//return escaper.matcher(str).replaceAll("\\\\$1");
return str.replaceAll("([^a-zA-Z0-9])", "\\\\$1");
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-19 16:26:48
Wzór.cytat ("blabla") działa ładnie.
Wzór.cytat () działa ładnie. Zamyka zdanie znakami "\Q " i " \ E ", a jeśli nie wymawia "\ Q " i "\ E". Jeśli jednak chcesz wykonać prawdziwe Wyrażenie regularne (lub niestandardowe), możesz użyć tego kodu:
String someText = "Some/s/wText*/,**";
System.out.println(someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
Ta metoda zwraca: niektóre/\s / wText*/\,**
Kod na przykład i testy:
String someText = "Some\\E/s/wText*/,**";
System.out.println("Pattern.quote: "+ Pattern.quote(someText));
System.out.println("Full escape: "+someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-31 12:38:58
^(negacja) symbol jest używany do dopasowania czegoś, co nie znajduje się w grupie znaków.
Info o negacji
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-22 15:00:14