Ich mag die Idee von StringTokenizer, weil es Enumerable ist.
Es ist aber auch veraltet und wird durch String.split ersetzt, das einen langweiligen String [] zurückgibt (und die Trennzeichen nicht enthält).
Also habe ich einen StringTokenizerEx implementiert, der ein Iterable ist und der einen echten regulären Ausdruck benötigt, um einen String zu teilen.
Ein wahrer regulärer Ausdruck bedeutet, dass es sich nicht um eine 'Zeichenfolge' handelt, die wiederholt wird, um das Trennzeichen zu bilden:
'o' stimmt nur mit 'o' überein und teilt 'ooo' in drei Trennzeichen mit zwei leeren Zeichenfolgen auf:
[o], '', [o], '', [o]
Der reguläre Ausdruck o + gibt jedoch das erwartete Ergebnis zurück, wenn "aooob" aufgeteilt wird.
[], 'a', [ooo], 'b', []
So verwenden Sie diesen StringTokenizerEx:
final StringTokenizerEx aStringTokenizerEx = new StringTokenizerEx("boo:and:foo", "o+");
final String firstDelimiter = aStringTokenizerEx.getDelimiter();
for(String aString: aStringTokenizerEx )
{
// uses the split String detected and memorized in 'aString'
final nextDelimiter = aStringTokenizerEx.getDelimiter();
}
Der Code dieser Klasse ist bei DZone Snippets verfügbar .
Kopieren Sie sie wie üblich für eine Code-Challenge- Antwort (eine in sich geschlossene Klasse mit Testfällen), fügen Sie sie ein (in ein 'src / test'-Verzeichnis) und führen Sie sie aus . Die main () -Methode veranschaulicht die verschiedenen Verwendungen.
Hinweis: (Ende 2009 bearbeiten)
Der Artikel Final Thoughts: Java Puzzler: Splitting Hairs leistet eine gute Arbeit, um das bizarre Verhalten in zu erklären String.split().
Josh Bloch antwortete sogar auf diesen Artikel:
Ja, das ist ein Schmerz. FWIW, es wurde aus einem sehr guten Grund gemacht: Kompatibilität mit Perl.
Der Typ, der es getan hat, ist Mike "madbot" McCloskey, der jetzt bei Google mit uns zusammenarbeitet. Mike stellte sicher, dass Javas reguläre Ausdrücke praktisch jeden der 30K Perl-Tests für reguläre Ausdrücke bestanden (und schneller liefen).
Die Google Common-Library Guava enthält auch einen Splitter:
- einfacher zu bedienen
- gepflegt von Google (und nicht von Ihnen)
Es kann sich also lohnen, ausgecheckt zu werden. Aus ihrer anfänglichen groben Dokumentation (pdf) :
JDK hat dies:
String[] pieces = "foo.bar".split("\\.");
Es ist in Ordnung, dies zu verwenden, wenn Sie genau das wollen, was es tut: - regulärer Ausdruck - Ergebnis als Array - seine Art, mit leeren Teilen umzugehen
Mini-Puzzler: ", a ,, b,". Split (",") gibt zurück ...
(a) "", "a", "", "b", ""
(b) null, "a", null, "b", null
(c) "a", null, "b"
(d) "a", "b"
(e) None of the above
Antwort: (e) Keine der oben genannten.
",a,,b,".split(",")
returns
"", "a", "", "b"
Nur nachlaufende Leergut wird übersprungen! (Wer kennt die Problemumgehung, um das Überspringen zu verhindern? Es macht Spaß ...)
In jedem Fall ist unser Splitter einfach flexibler: Das Standardverhalten ist simpel:
Splitter.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
Wenn Sie zusätzliche Funktionen wünschen, fragen Sie nach!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
Die Reihenfolge der Konfigurationsmethoden spielt keine Rolle. Während des Aufteilens erfolgt das Zuschneiden, bevor nach Leergut gesucht wird.