2015-07-28 16 views
12

Die Split-Funktionalität scheint zwischen Java und JavaScript zu unterscheiden.Java vs JavaScript Split-Verhalten

Ich muss nicht unbedingt bestimmte Kriterien für reguläre Ausdrücke erfüllen oder Lookahead basierte Regex verwenden. Mein Problem besteht darin, dass leere Übereinstimmungen nach dem letzten Matching der geteilten Regex gezogen werden (was eine einfache Menge von Zeichen und kein Ausdruck ist).

Unten ist ein Beispiel für die Ausgabe, die ich versuche zu erreichen und was ich wirklich bekomme.

Java

("~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~").split("~#~") 

/* results with an array of length 8 */ (java.lang.String[]) [, , , A, B, C, D, E] 

Javascript

"~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~".split("~#~") 
/* results with an array of length 11 */ ["", "", "", "A", "B", "C", "D", "E", "", "", ""] 

Ich kann wirklich nicht für diese meine Hände auf eine gute Erklärung setzen, wie ich mit einer Java-Anwendung arbeite und die Spaltung ist verursacht mir Probleme, ich möchte das gleiche Ergebnis wie in JavaScript. Wie kann ich das bekommen?

+27

Trotz des Namens Ähnlichkeiten eine überladene Methode ist (vielleicht jemals die dümmste Entscheidung), sind sie verschiedene Sprachen tatsächlich. Sie werden feststellen, dass der "Split" in C auch anders funktioniert (indem er sich darüber beschwert, dass er es meistens nicht finden kann). – paxdiablo

+6

Wie macht es überhaupt Sinn, dass Java die leeren Strings am Ende des Splits auslässt, aber nicht die vorhergehenden? Das Ergebnis, das Javascript Ihnen gibt, macht viel mehr Sinn. – connexo

+6

@connexo: http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split%28java.lang.String%29: 'Nachlaufende leere Zeichenfolgen sind daher nicht in der resulting array.' – paxdiablo

Antwort

30

Javadoc- auf split(String regex):

Diese Methode funktioniert, als ob durch das Zweiargument Split-Methode mit dem gegebenen Ausdruck und ein Grenz Argumente von null aufrufen. Nachlaufende leere Zeichenfolgen sind daher nicht in dem resultierenden Array enthalten.

Javadoc- auf split(String regex, int limit):

Wenn n nicht positiv ist, dann wird das Muster so oft wie möglich angewendet werden, und die Anordnung kann eine beliebige Länge haben. Wenn n Null ist, wird das Muster so oft wie möglich angewendet, das Array kann eine beliebige Länge haben, und nachfolgende leere Strings werden verworfen.

So ... split("~#~", -1) sollte den Trick tun.

1

Javas split() Dokumentation erwähnt deutlich, dass die abschließenden leeren Zeichenfolgen NICHT enthalten sein werden.

Diese Methode funktioniert wie durch Aufrufen der Split-Methode mit zwei Argumenten mit der angegebene Ausdruck und ein Limit-Argument von Null. Nachlauf leer Strings sind daher nicht im resultierenden Array enthalten.

7

Die split() - Dokumentation von Java erwähnt deutlich, dass die nachfolgenden leeren Strings NICHT enthalten sind.

Diese Methode funktioniert wie durch Aufrufen der Split-Methode mit zwei Argumenten mit der angegebene Ausdruck und ein Limit-Argument von Null. Nachgestellte leere Zeichenfolgen sind daher nicht in dem resultierenden Array enthalten.

aber Sie können es erreichen, indem

("~#~~#~~#~A~#~B~#~C~#~D~#~E~#~~#~~#~").split("~#~" , -1) 

die