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.

Author: Matt, 2008-09-13

8 answers

Od Java 1.5, TAK :

Pattern.quote("$5");
 413
Author: Mike Stone,
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"));
 96
Author: Pavel Feldman,
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);
 24
Author: Androidme,
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.

 13
Author: Rob Oxspring,
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ć.
 10
Author: Meower68,
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");
    }
}
 4
Author: Moscow Boy,
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"));
 1
Author: Adam111p,
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

Wyrażenia Regularne

 0
Author: Akhil Kathi,
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