Wie und warum? Bedeutet dies eine Regex, die ein Zeichen bedeutet? In meinen Augen sollte dies bei der Funktionsweise von split nur auf die tatsächlichen Zeichen (,?,!, ^ Und) aufgeteilt werden. Es funktioniert jedoch so, wie Sie es sagen.
@ EW-CodeMonkey (?!... )ist eine Regex-Syntax für eine negative Behauptung - es wird behauptet, dass es keine Übereinstimmung mit dem gibt, was darin enthalten ist. Und ^stimmt mit dem Anfang der Zeichenfolge überein, sodass der reguläre Ausdruck an jeder Position übereinstimmt, die nicht der Anfang der Zeichenfolge ist, und fügt dort einen Split ein. Dieser reguläre Ausdruck stimmt auch am Ende der Zeichenfolge überein und würde daher auch eine leere Zeichenfolge an das Ergebnis anhängen, mit der Ausnahme, dass in der String.splitDokumentation angegeben wird, dass "nachfolgende leere Zeichenfolgen nicht im resultierenden Array enthalten sind".
Boann
8
In Java 8 wurde das Verhalten von String.splitgeringfügig geändert, sodass führende leere Zeichenfolgen, die durch eine Übereinstimmung mit der Breite Null erzeugt wurden, ebenfalls nicht im Ergebnisarray enthalten sind. Daher wird die (?!^)Behauptung, dass die Position nicht der Anfang der Zeichenfolge ist, unnötig, sodass der reguläre Ausdruck dies zulässt zu nichts vereinfacht werden - "cat".split("")- aber in Java 7 und darunter erzeugt dies eine führende leere Zeichenfolge im Ergebnisarray.
Boann
1
Es wird ein Array einer gesamten Zeichenfolge erstellt.
Dies war eine schreckliche Änderung in jdk8, weil ich mich auf split ("") verlassen und Problemumgehungen für diesen albernen leeren ersten Index durchgeführt habe. Jetzt, nach dem Upgrade auf Java8, funktioniert es so, wie ich es vor Jahren erwartet hätte. Leider bricht jetzt meine Problemumgehung meinen Code ... ggrrrr.
Marc
@Marc Du solltest wahrscheinlich .toCharArray()sowieso verwenden; Es vermeidet Regex und gibt eine Reihe von charGrundelementen zurück, sodass es schneller und leichter ist. Es ist seltsam, ein Array von Zeichenfolgen mit 1 Zeichen zu benötigen .
Nitpicking, die ursprüngliche Frage fragt nach einem Array von String, nicht nach einem Array von Char. Es ist jedoch recht einfach, von hier aus ein Array von Strings zu erhalten.
Dsolimano
Ja, ich weiß bereits, wie man eine Reihe von Zeichen bekommt. Ich kann einfach durch das char-Array iterieren und aus jedem einen String erstellen, wenn es keinen anderen Weg gibt.
Matt
Wie würden Sie konvertieren cArrayzurück String?
Bitmap
Die korrekte Syntax wäre: char [] cArray = str.ToCharArray ();
dbz
6
Wenn bei der Eingabe Zeichen außerhalb der mehrsprachigen Basisebene erwartet werden (einige CJK-Zeichen, neues Emoji ...), können Ansätze wie "a💫b".split("(?!^)")diese nicht verwendet werden, da sie solche Zeichen aufteilen (Ergebnisse in array ["a", "?", "?", "b"]) und etwas Sichereres verwendet werden muss:
Eine effiziente Möglichkeit, einen String in ein Array von Strings mit einem Zeichen umzuwandeln, besteht darin, Folgendes zu tun:
String[] res =newString[str.length()];for(int i =0; i < str.length(); i++){
res[i]=Character.toString(str.charAt(i));}
Dies berücksichtigt jedoch nicht die Tatsache, dass a charin a Stringtatsächlich die Hälfte eines Unicode-Codepunkts darstellen könnte. (Wenn sich der Codepunkt nicht im BMP befindet.) Um damit umzugehen, müssen Sie die Codepunkte durchlaufen ... was komplizierter ist.
Dieser Ansatz ist schneller als die Verwendung String.split(/* clever regex*/)und wahrscheinlich schneller als die Verwendung von Java 8+ -Streams. Es ist wahrscheinlich schneller als dies:
String[] res =newString[str.length()];int0=0;for(char ch: str.toCharArray[]){
res[i++]=Character.toString(ch);}
weil toCharArraymuss die Zeichen in ein neues Array kopieren .
Möglicherweise können Sie eine for-Schleife verwenden, die den String-Inhalt durchläuft und mithilfe der charAtMethode Zeichen für Zeichen extrahiert .
In Kombination mit einem ArrayList<String>können Sie beispielsweise eine Reihe einzelner Zeichen erhalten.
Vielleicht könntest du auf einem Bein stehen und "God Save the Queen" singen. Entschuldigung, aber das ist noch lange nicht richtig.
Stephen C
0
Wenn die ursprüngliche Zeichenfolge zusätzliche Unicode-Zeichen enthält , split()funktioniert dies nicht, da diese Zeichen in Ersatzpaare aufgeteilt werden. Um diese Sonderzeichen richtig zu behandeln, funktioniert ein Code wie dieser:
String[] chars =newString[stringToSplit.codePointCount(0, stringToSplit.length())];for(int i =0, j =0; i < stringToSplit.length(); j++){int cp = stringToSplit.codePointAt(i);char c[]=Character.toChars(cp);
chars[j]=newString(c);
i +=Character.charCount(cp);}
.split("")
wird es tun.Antworten:
Dies wird produzieren
quelle
(?!
...)
ist eine Regex-Syntax für eine negative Behauptung - es wird behauptet, dass es keine Übereinstimmung mit dem gibt, was darin enthalten ist. Und^
stimmt mit dem Anfang der Zeichenfolge überein, sodass der reguläre Ausdruck an jeder Position übereinstimmt, die nicht der Anfang der Zeichenfolge ist, und fügt dort einen Split ein. Dieser reguläre Ausdruck stimmt auch am Ende der Zeichenfolge überein und würde daher auch eine leere Zeichenfolge an das Ergebnis anhängen, mit der Ausnahme, dass in derString.split
Dokumentation angegeben wird, dass "nachfolgende leere Zeichenfolgen nicht im resultierenden Array enthalten sind".String.split
geringfügig geändert, sodass führende leere Zeichenfolgen, die durch eine Übereinstimmung mit der Breite Null erzeugt wurden, ebenfalls nicht im Ergebnisarray enthalten sind. Daher wird die(?!^)
Behauptung, dass die Position nicht der Anfang der Zeichenfolge ist, unnötig, sodass der reguläre Ausdruck dies zulässt zu nichts vereinfacht werden -"cat".split("")
- aber in Java 7 und darunter erzeugt dies eine führende leere Zeichenfolge im Ergebnisarray.Aber wenn Sie Strings brauchen
Bearbeiten: Gibt einen leeren ersten Wert zurück.
quelle
.toCharArray()
sowieso verwenden; Es vermeidet Regex und gibt eine Reihe vonchar
Grundelementen zurück, sodass es schneller und leichter ist. Es ist seltsam, ein Array von Zeichenfolgen mit 1 Zeichen zu benötigen .quelle
cArray
zurückString
?Wenn bei der Eingabe Zeichen außerhalb der mehrsprachigen Basisebene erwartet werden (einige CJK-Zeichen, neues Emoji ...), können Ansätze wie
"a💫b".split("(?!^)")
diese nicht verwendet werden, da sie solche Zeichen aufteilen (Ergebnisse inarray ["a", "?", "?", "b"]
) und etwas Sichereres verwendet werden muss:quelle
Um die anderen Antworten zusammenzufassen ...
Dies funktioniert auf allen Java-Versionen:
Dies funktioniert nur unter Java 8 und höher:
quelle
Eine effiziente Möglichkeit, einen String in ein Array von Strings mit einem Zeichen umzuwandeln, besteht darin, Folgendes zu tun:
Dies berücksichtigt jedoch nicht die Tatsache, dass a
char
in aString
tatsächlich die Hälfte eines Unicode-Codepunkts darstellen könnte. (Wenn sich der Codepunkt nicht im BMP befindet.) Um damit umzugehen, müssen Sie die Codepunkte durchlaufen ... was komplizierter ist.Dieser Ansatz ist schneller als die Verwendung
String.split(/* clever regex*/)
und wahrscheinlich schneller als die Verwendung von Java 8+ -Streams. Es ist wahrscheinlich schneller als dies:weil
toCharArray
muss die Zeichen in ein neues Array kopieren .quelle
Möglicherweise können Sie eine for-Schleife verwenden, die den String-Inhalt durchläuft und mithilfe der
charAt
Methode Zeichen für Zeichen extrahiert .In Kombination mit einem
ArrayList<String>
können Sie beispielsweise eine Reihe einzelner Zeichen erhalten.quelle
Wenn die ursprüngliche Zeichenfolge zusätzliche Unicode-Zeichen enthält ,
split()
funktioniert dies nicht, da diese Zeichen in Ersatzpaare aufgeteilt werden. Um diese Sonderzeichen richtig zu behandeln, funktioniert ein Code wie dieser:quelle
split("(?!^)")
funktioniert nicht richtig, wenn die Zeichenfolge Ersatzpaare enthält. Sie sollten verwendensplit("(?<=.)")
.Ausgabe:
quelle
quelle