2008-10-03 21 views
12

In Java in Java analysiert zu werden, nehme ich eine String-Variable S haben, und ich möchte, wie so für sie innerhalb eines anderen String T, suchen:aus einem String Escaping regex

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

(Anmerkung: die Oberhalb der Zeile war T.contains(), bis einige Posts darauf hinwiesen, dass diese Methode keine Regexes verwendet. Mein Schlechter.)

Aber jetzt angenommen, S könnte unappetitliche Zeichen enthalten. Zum Beispiel sei S = "[hi". Die linke eckige Klammer wird dazu führen, dass die Regex fehlschlägt. Gibt es eine Funktion, die ich anrufen kann, um S zu entkommen, damit das nicht passiert? In diesem speziellen Fall möchte ich, dass es in "\ [hi" umgewandelt wird.

+1

Mögliche Duplikate von [Wie Text für regulären Ausdruck in Java zu entkommen] (http://stackoverflow.com/questions/60160/how-to-escape-text-for-regular-expression-in-java) –

Antwort

20

String.contains verwendet Regex nicht, daher gibt es in diesem Fall kein Problem.

Wenn eine Regex erforderlich ist, anstatt Zeichenketten mit Regex-Sonderzeichen abzulehnen, verwenden Sie java.util.regex.Pattern.quote, um sie zu umgehen.

2

Gibt es einen besonderen Grund, String.indexOf() nicht zu verwenden? Auf diese Weise wird es immer als reguläre Zeichenfolge und nicht als Regex interpretiert.

+1

Seit Java 1.5 gibt es String # enthält (...), was zu besser lesbarem Code als indexOf (...) führt. –

0

Regex verwendet den umgekehrten Schrägstrich '\', um ein Literal zu umgehen. Da Java verwendet auch der umgekehrte Schrägstrich Sie müssen eine doppelte bashslash verwenden wie:

String S = "\\[hi" 

Das wird dich der String:

\[hi 

die den regulären Ausdruck übergeben wird.

Oder wenn Sie nur über eine wörtliche String Pflege und brauchen keine regex Sie Folgendes tun können:

if (T.indexOf("[hi") != -1) { 
11

Wie Tom Hawtin gesagt, müssen Sie das Muster angeben. Sie können dies auf zwei Arten tun (edit: eigentlich drei Möglichkeiten, wie @diastrophism wies darauf hin):

  1. Surround den String mit "\ Q" und "\ E", wie:

    if (T.matches("\\Q" + S + "\\E")) 
    
  2. Verwenden Sie stattdessen Pattern. Der Code wäre etwas in der Art:

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

    Auf diese Weise können Sie das kompilierte Muster zwischenspeichern und wiederverwenden. Wenn Sie den gleichen Regex mehr als einmal verwenden, möchten Sie es fast sicher so machen.

Beachten Sie, wenn Sie reguläre Ausdrücke verwenden, um zu testen, ob ein String in einer größeren Zeichenfolge ist, sollten Sie setzen. * Am Anfang und am Ende des Ausdrucks. Dies funktioniert jedoch nicht, wenn Sie das Muster angeben, da es dann nach tatsächlichen Punkten sucht. Sind Sie absolut sicher, dass Sie reguläre Ausdrücke verwenden möchten?