Frage

In Java, nehme ich ein String-Variable S habe, und ich mag es innerhalb einer anderen String T suchen, etwa so:

   if (T.matches(S)) ...

(Anmerkung:.. Die über die Linie war T.contains (), bis vor ein paar Stellen darauf hingewiesen, dass diese Methode nicht reguläre Ausdrücke nicht verwendet My bad)

Aber nehmen wir nun S darin unappetitlichen Zeichen haben. Nehmen wir zum Beispiel S = „[hallo“. Die linke eckige Klammer wird die Regex verursachen zum Scheitern verurteilt. Gibt es eine Funktion, die ich anrufen kann S zu entkommen, so dass dies nicht geschieht? In diesem speziellen Fall möchte ich es „\ [hallo“ umgewandelt werden.

War es hilfreich?

Lösung

String.contains nicht regex verwenden, so dass es kein Problem in diesem Fall ist.

Wenn eine Regex erforderlich ist, eher Strings mit regex Sonderzeichen Ablehnung verwendet java.util.regex.Pattern.quote sie zu entkommen.

Andere Tipps

Wie Tom Hawtin sagte, Sie müssen das Muster zitieren. Sie können diese (edit auf zwei Arten tun: eigentlich drei Möglichkeiten, wie @ diastrophism ):

  1. Surround die Zeichenfolge mit "\ Q" und "\ E", wie:

    if (T.matches("\\Q" + S + "\\E"))
    
  2. Verwenden Sie Muster statt. Der Code würde wie folgt sein:

    Pattern sPattern = Pattern.compile(S, Pattern.LITERAL);
    if (sPattern.matcher(T).matches()) { /* do something */ }
    

    Auf diese Weise können Sie die kompilierte Muster-Cache und es wiederverwenden. Wenn Sie die gleiche Regex mehr verwenden als einmal, Sie mit ziemlicher Sicherheit wollen es auf diese Art und Weise zu tun.

Beachten Sie, wenn Sie reguläre Ausdrücke zu testen verwenden, ob eine Zeichenfolge in einem größeren String ist, sollten Sie setzen. * Am Anfang und am Ende des Ausdrucks. Aber das wird nicht funktionieren, wenn Sie das Muster zitieren, da es dann für die tatsächlichen Punkte suchen werden. Also, sind Sie absolut sicher, dass Sie möchten, reguläre Ausdrücke zu verwenden?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top