2016-10-28 1 views
1

Ich stieß auf die folgende Zeichenfolge aufgeteilt line.split ("\ s * //") [0] aber kann nicht scheinen, finden Sie Dokumentation auf die Verwendung des '/' - Zeichens in regulären Ausdrücken.Java regex line.split ("\ s * //")

Hier mein Code:

String line = "type=path.composition id=pathComp"; 
line = line.split("\\s*//")[0]; 

Console console = System.console(); 
System.out.println("This is the line: " + line); 

Hier die Ausgabe:

This is the line: type=rule.composition id=ruleComp 

Ich frage mich, was genau ‚/‘ tut, um den regulären Ausdruck und habe mich gefragt, ob jemand in der Lage sein würde, mich zu zeigen zu irgendeiner Dokumentation und/oder einer Antwort, die hervorhebt, was es tut?

Ich bemerkte auch, dass, wenn ich das "//" aus der Regex entferne, die Ausgabe nur zum ersten Zeichen wird, was wohl Sinn macht, da \ s * bedeutet, dass der Ausdruck auf null oder mehr Leerzeichen spuckt Figuren.

This is the line: t 

Dies jedoch stellt sich die Frage: „Was bedeutet die‚//‘in den regulären Ausdruck, der die Spaltung am Ende der Leitung auftreten, sieht“?

Jeder Rat würde sehr geschätzt werden.

Z

+4

A '/' macht nichts Besonderes und wird wörtlich genommen; kannst du "\ s * //" "lesen" und sehen, was es an erster Stelle bedeutet? – fge

+0

Hallo fge. Danke dafür. Ich bin mir nicht sicher, ob '/' wörtlich genommen würde. Es erlaubt sicherlich, die Zeile bis zum Ende zu lesen. Wenn ich den Rückgabewert entferne, ändert sich dies in 'Dies ist die Zeile: t'. Was meinst du mit "'lese' \ s * //"? – Z101

+1

Der Regex '" \\ s * // "bedeutet" zwei Vorwärtsstriche, denen gegebenenfalls Whitespaces vorangestellt sind ". Da Ihre Eingabezeichenfolge keine Schrägstriche hat, ** ist die Zeichenfolge * nicht * geteilt ** und wird einfach unverändert zurückgegeben. Wie die [javadoc] (https://docs.oracle.com/javase/8/docs/api/java/lang/String.html#split-java.lang.String-int-) sagt: * Wenn der Ausdruck tut nicht übereinstimmen irgendein Teil der Eingabe dann das resultierende Array hat nur ein Element, nämlich diese Zeichenfolge. * – Andreas

Antwort

2

Betrachten Sie Ihre Eingabe von Text (type=rule.composition id=ruleComp), und die zwei Regexes:

  • regex 1: \s*//;
  • regex 2: \s*.

Wenn Sie versuchen, und .split() gegen einen regulären Ausdruck, die Regex-Engine wird versuchen, den regulären Ausdruck (was aus dem Textliteral als Argument berechnet wird) und diese beiden Dinge passieren kann:

  • die Regex kann nichts zuordnen (das passiert bei Regex 1): Die Aufteilung kann nicht funktionieren und das 0. Element ist der Eingabetext;
  • die Regex kann eine leere Zeichenfolge (das ist, was passiert mit Regex 2): In diesem Fall merkt die Regex-Engine dies und kann nicht die Situation weitermachen, da es sonst zu einer Endlosschleife führen würde. Deshalb rückt es mit einem Token vor, um fortzufahren.

Daher Ihre Ergebnisse:

  • mit dem ersten regulären Ausdruck ist nichts abgestimmt;
  • mit der zweiten Regex wird eine leere Zeichenfolge abgestimmt; Die Regex-Engine entscheidet sich für die Verschiebung eines Zeichens und betrachtet den "verworfenen" Text (das vorherige Token) als das 0. Match.
+1

Genauer gesagt, die zweite Regex wird dieses Array zurückgeben: 'new String [] {" t "," y "," p " "e", "=", "p", "a", "t", "h", ".", "c", "o", "m", "p", "o", "o" s "," i "," t "," ich "," o "," n "," "," ich "," d "," = "," p "," a "," t ", "h", "C", "o", "m", "p"} ' – Andreas

+0

@Andreas tatsächlich; Ich war zu faul, mich komplett zu erweitern :) – fge

+0

Ich war eigentlich überrascht, dass es eine leere Zeichenfolge zurückgegeben, wo der Platz ist. Ich hätte gedacht, die Regex wäre gierig und der Raum plus die zwei leeren Strings um ihn herum wäre ein einzelnes Trennzeichen. – Andreas