2016-03-18 6 views
0

Ich bin wirklich verwirrt, wie zu entkommen. Manchmal muss ich nur einen umgekehrten Schrägstrich vorgeben, aber manchmal muss ich einen doppelten Backslash wie "\\." voranstellen. Könnte mir jemand sagen warum?Java Regular Expression - wie Backslash zu verwenden

Auch könnte jemand geben mir eine Erklärung des Unterschieds in

  • String.split("\t"),
  • String.split("\\t"),
  • String.split("\\\t"),
  • String.split("\\\\t")?
+1

Sie könnten nur Ihre Frage bearbeiten, anstatt einen Kommentar hinzuzufügen und den falschen Text zu hinterlassen. – csmckelvey

+0

Fügen Sie so viele Backslashs hinzu, bis es funktioniert. – Tunaki

Antwort

3

Aufkantung ist Sonderzeichen in Zeichenketten - wir \n erstellen können oder " wie \" entkommen.

Aber Backslash ist auch in regulären Ausdruck engine - zum Beispiel können wir es verwenden, um Standardzeichen Klassen wie \w\d\s zu verwenden.

Also, wenn Sie wollen Zeichenfolge erstellen, die wird Regex/Text darstellen wie \w Sie müssen es als "\\w" zu schreiben.

Wenn Sie regex schreiben wollen, die \ wörtliche dann darstellen Text darstellen solche Regex wie \\ aussehen muss, was bedeutet, String mit solchen Text als "\\\\" geschrieben werden muss.
Mit anderen Worten müssen wir Backslash zweimal entkommen:
- einmal in regex \\
- und einmal in String "\\\\".

Wenn Sie zu Regex-Engine-Literal übergeben werden, die Registerkarte darstellen wird, dann müssen Sie Backslash überhaupt nicht entgehen. Java wird verstehen, "\t" Zeichenfolge als Zeichenfolge, die Registerkarte Zeichen darstellt, und Sie können eine solche Zeichenfolge problemlos an Ihre Regex-Engine übergeben.

Für unsere Komfort Regex-Engine in Java interpretiert Text darstellen \t (auch \r und \n) genauso wie Stringliterale "\t" interpretieren. Mit anderen Worten, wir können den Regex-Engine-Text übergeben, der \ Zeichen und t Zeichen darstellt und sicher sein, dass es als Darstellung von Tab-Zeichen interpretiert wird.

So Code wie split("\t") oder split("\\t") wird versuchen, auf Registerkarte zu teilen.

Code wie split("\\\\t") wird versuchen, Text nicht auf Tab-Zeichen, sondern auf \ Zeichen gefolgt von t zu teilen. Es passiert, weil "\\\\" wie erklärt Text \\ darstellt, die Regex-Engine als Escapezeichen \ sieht (so wird es als Literal behandelt).

+0

Ich arbeite an der Erklärung von 'String.split (" \\\ t ")'. Es sieht aus wie Regex-Engine erlaubt Text '\ [tab]' repräsentieren '[tab]'.Ich weiß nicht, warum es so ist. Ich würde hier eine Ausnahme erwarten, da ein solcher Ausdruck höchstwahrscheinlich auf einen Fehler zurückzuführen ist. – Pshemo

+0

Vielen Dank. Du hast meine Verwirrung gelöst. Aber ich habe noch eine Frage, was ist das Ergebnis von String.split ("\\ a")? "\\ a" bedeutet "\ a" in Regex, aber was bedeutet diese Regex? – youngyjd

+0

Ja '" \\ a "' steht für '\ a' regex (Text, der an die Regex-Engine übergeben wird) und entsprechend der Musterklassendokumentation (https://docs.oracle.com/javase/8/docs/api/ java/util/regex/Pattern.html) '\ a' steht für" Das Alarm (Glocke) Zeichen ('\ u0007') ". – Pshemo