2012-04-09 11 views
4

Wenn ich eine Zeichenfolge in Python aufgeteilt wird benachbarter Raum delimiters fusioniert:Python geteilt Semantik in Java

>>> str = "hi    there" 
>>> str.split() 
['hi', 'there'] 

In Java werden die Begrenzungszeichen nicht fusionieren:

$ cat Split.java 
class Split { 
    public static void main(String args[]) { 
     String str = "hi    there"; 
     String result = ""; 
     for (String tok : str.split(" ")) 
      result += tok + ","; 
     System.out.println(result); 
    } 
} 
$ javac Split.java ; java Split 
hi,,,,,,,,,,,,,,there, 

Gibt es eine einfache Möglichkeit, Python Space Split Semantik in Java zu bekommen?

Antwort

6

String.split nimmt einen regulären Ausdruck, so bieten sie mit einer, den benachbarten Leerzeichen entspricht:

str.split("\\s+") 

Wenn Sie das genaue Verhalten von Pythons str.split() nacheifern wollen, müssen Sie auch trimmen:

str.trim().split("\\s+") 

Zitat aus dem Python docs on str.split():

Wenn sep nicht angegeben ist oder Kein ist, wird ein anderer Aufteilungsalgorithmus angewendet: Läufe von aufeinander folgenden Leerzeichen werden als einzelnes Trennzeichen betrachtet, und das Ergebnis enthält keine leeren Zeichenfolgen am Anfang oder Ende, wenn die Zeichenfolge vorangestellt ist oder nachgestellte Leerzeichen. Wenn Sie also eine leere Zeichenfolge oder eine Zeichenfolge bestehend aus nur Leerzeichen mit einem None Trennzeichen trennen, wird [] zurückgegeben.

So die oben ist noch keine genaue Entsprechung, weil es [''] für den leeren String zurück, aber es ist wahrscheinlich in Ordnung für Ihre Zwecke :)

+0

Vielen Dank. Mir fiel es schwer, die Syntax der Regex in der Dokumentation zu finden: http://docs.oracle.com/javase/6/docs/api/java/lang/String.html#split%28java.lang.String % 29 –

+0

@Andrew: Ein besserer Ort, um über Regexes zu lernen ist http://www.regular-expressions.info/ :) –

+0

Es war im Allgemeinen nicht regexs, aber regexes in Java, die mich austricksen. Ich hatte versucht "*", was kläglich versagte. –

0

in Java, nimmt String.split einen regulären Ausdruck. So können Sie str.split(" +") tun, um Python-Semantik zu erhalten.

+1

Nein, das ist nicht ganz das gleiche für einen Zeichenfolge wie 'foo \ tbar' –

+0

@ NiklasB. OK, ich verstehe. OP bat um split() not split ('') – fqsxr

+1

Nun, die Frage speziell nach "Leerzeichen Trennzeichen" und nach "Leerzeichen Split-Semantik" im Gegensatz zu "Leerzeichen Leerzeichen Trennzeichen" oder "Leerzeichen Split-Semantik", also in einem zu pedantisch Die Whitespace-Kommentare sind ein Bonus, der nicht Teil der ursprünglichen Frage ist. –

1

Verwenden Sie stattdessen str.split("\\s+"). Dies wird tun, was Sie brauchen.

1

Java verwendet Regex zum Teilen.

so Split auf einem einzelnen Raum wird Ihnen absolut viele Array-Elemente.

Python split, ltrims und rtrims und nimmt dann Leerzeichen in ein einziges Leerzeichen, wenn kein Parameter übergeben wurde. So

es wäre richtig

"my    string".trim().split("\\s+"); 
+0

Nein, das ist nicht ganz dasselbe für eine Zeichenkette wie 'foo \ tbar' –

+0

richtig, aber das ist nicht wann wurde präsentiert :) was vorgestellt wurde ist foo bar. nicht foo \ tbar. :) –

+0

Was gefragt wurde, ist das Äquivalent zu 'split()' in Python, was Ihr Beispiel nicht ist. –

1

Das Problem mit Niklas B. Antwort sein, dass trim seine eigene Definition von Leerzeichen hat, das heißt, alles, was mit dem Code bis zu '\u0020'. Folgendes sollte der Python-Version nahe kommen, einschließlich der Korrektur für die leere Zeichenfolge:

class TestSplit { 

    private static final String[] EMPTY = {}; 

    private static String[] pySplit(String s) { 
     s = s.replaceAll("^\\s+", "").replaceAll("\\s+$", ""); 
     if (s.isEmpty()) return EMPTY; 
     return s.split("\\s+"); 
    } 
}