Austretende einen String aus immer in Java regex analysiert
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.
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 ):
-
Surround die Zeichenfolge mit "\ Q" und "\ E", wie:
if (T.matches("\\Q" + S + "\\E"))
-
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?
Regex verwendet den umgekehrten Schrägstrich ‚\‘ wörtlich zu entkommen. Da Java verwendet auch der umgekehrte Schrägstrich Sie müssen eine doppelte bashslash verwenden wie:
String S = "\\[hi"
Das wird sich der String:
\[hi
, die an die Regex übergeben werden.
Oder wenn Sie nur über eine wörtliche String Pflege und brauchen keine regex Sie Folgendes tun können:
if (T.indexOf("[hi") != -1) {
T.contains () (gemäß Javadoc-: http://java.sun.com/javase/6/docs/api/java/lang/String.html ) Regexes nicht verwendet. () enthält Delegierten indexOf () nur.
So gibt es keine regulären Ausdrücke hier verwendet. Wurden Sie von einer anderen String Methode gedacht?