Frage

Hat Java hat eine eingebaute Möglichkeit, beliebigen Text zu entkommen, so dass es in einem regulären Ausdruck aufgenommen werden? Zum Beispiel, wenn meine Benutzer eingeben „$ 5“, ich mag, dass genau passen, anstatt ein „5“ nach dem Ende der Eingabe.

War es hilfreich?

Lösung

Andere Tipps

Der Unterschied zwischen Pattern.quote und Matcher.quoteReplacement war mir nicht klar, bevor ich folgendes Beispiel sah

s.replaceFirst(Pattern.quote("text to replace"), 
               Matcher.quoteReplacement("replacement text"));

Es ist vielleicht zu spät zu reagieren, aber Sie können auch Pattern.LITERAL verwenden, die alle Sonderzeichen während der Formatierung ignorieren:

Pattern.compile(textToFormat, Pattern.LITERAL);

Ich denke, was Sie nach \Q$5\E ist. Siehe auch Pattern.quote(s) eingeführt in Java5.

Siehe Pattern javadoc für Details.

Zunächst einmal, wenn

  • Sie verwenden replaceAll ()
  • Sie nicht verwenden Matcher.quoteReplacement ()
  • der Text ersetzt wird in einem $ 1 enthält

Es wird keine 1 am Ende setzen. Es wird für die erste passende Gruppe an der Suche regex suchen und sub, die in diesem ist, was $ 1, $ 2 oder $ 3 Mittel im Ersetzungstext:.. Gruppen aus dem Suchmuster passende

I-Stecker häufig lange Textzeichenfolgen in .properties-Dateien, dann E-Mail-Fächer und Einrichtungen von denen generieren. Tatsächlich scheint dies der Standard Weg, um i18n in Spring Framework zu tun. Ich habe XML-Tags, als Platzhalter, in die Saiten und ich verwende replaceAll (), um die XML-Tags mit den Werten zur Laufzeit zu ersetzen.

Ich lief in ein Problem, bei dem eine Benutzereingabe einer Dollar-und-Cent Figur, mit einem Dollar-Zeichen. replaceAll () verschluckte sich an sie, mit den folgenden in einem stracktrace zeigt sich:

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)

In diesem Fall hatte der Benutzer eingegeben „$ 3“ irgendwo in ihrem Eingang und replaceAll () ging bei der Suche regex Suche nach der dritten passenden Gruppe, nicht einen gefunden hat, und kotzte.

Gegeben:

// "msg" is a string from a .properties file, containing "<userInput />" among other tags
// "userInput" is a String containing the user's input

ersetzt

msg = msg.replaceAll("<userInput \\/>", userInput);

mit

msg = msg.replaceAll("<userInput \\/>", Matcher.quoteReplacement(userInput));

das Problem gelöst. Der Benutzer kann in jeder Art von Zeichen setzen, einschließlich der Dollar-Zeichen, ohne Frage. Es verhielt sich genau so, wie man erwarten würde.

geschützt Muster haben Sie alle Symbole ersetzen kann mit „\\\\“, außer Ziffern und Buchstaben. Und danach können Sie in diesem geschützten Muster Ihre speziellen Symbole setzen, um diese Muster zu machen die Arbeit nicht dumm zitierten Text mögen, aber wirklich wie ein patten, aber Ihre eigene. Ohne Benutzersonderzeichen.

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

Pattern.quote ( "blabla") funktioniert gut.

Die Pattern.quote () funktioniert gut. Es umschließt den Satz mit den Zeichen " \ Q " und " \ E ", und wenn ja entkommen "\ Q" und "\ E". Allerdings, wenn Sie benötigen einen echten regulären Ausdruck zu entkommen (oder benutzerdefinierte Flucht) zu tun, können Sie diesen Code verwenden:

String someText = "Some/s/wText*/,**";
System.out.println(someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));

Diese Methode gibt: Einige / \ s / wText * / \, **

-Code zum Beispiel und Prüfungen:

String someText = "Some\\E/s/wText*/,**";
System.out.println("Pattern.quote: "+ Pattern.quote(someText));
System.out.println("Full escape: "+someText.replaceAll("[-\\[\\]{}()*+?.,\\\\\\\\^$|#\\\\s]", "\\\\$0"));

^ (Negierung) Symbol wird verwendet, um etwas zu entsprechen, die nicht in der Zeichengruppe ist.

Dies ist der Link auf

scroll top