Saya suka gagasan StringTokenizer karena itu Enumerable.
Tapi itu juga sudah usang, dan ganti dengan String.split yang mengembalikan String yang membosankan [] (dan tidak termasuk pembatas).
Jadi saya menerapkan StringTokenizerEx yang merupakan Iterable, dan yang membutuhkan regexp sejati untuk membagi string.
Regexp sejati berarti itu bukan 'Urutan karakter' yang diulang untuk membentuk pembatas:
'o' hanya akan cocok dengan 'o', dan membagi 'ooo' menjadi tiga pembatas, dengan dua string kosong di dalamnya:
[o], '', [o], '', [o]
Tetapi regexp o + akan mengembalikan hasil yang diharapkan saat memisahkan "aooob"
[], 'a', [ooo], 'b', []
Untuk menggunakan StringTokenizerEx ini:
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();
}
Kode kelas ini tersedia di Cuplikan DZone .
Seperti biasa untuk respons kode-tantangan (satu kelas mandiri dengan kasus uji termasuk), salin-tempel (dalam direktori 'src / test') dan jalankan . Metode utamanya () menggambarkan penggunaan yang berbeda.
Catatan: (sunting akhir 2009)
Artikel Final Thoughts: Java Puzzler: Splitting Hairs bekerja dengan baik menjelaskan perilaku aneh di Indonesia String.split().
Josh Bloch bahkan berkomentar menanggapi artikel itu:
Ya, ini menyakitkan. FWIW, itu dilakukan untuk alasan yang sangat bagus: kompatibilitas dengan Perl.
Orang yang melakukannya adalah Mike "madbot" McCloskey, yang sekarang bekerja bersama kami di Google. Mike memastikan bahwa ekspresi reguler Java lulus hampir setiap tes ekspresi reguler 30K Perl (dan berlari lebih cepat).
Google common-library Guava juga mengandung Splitter yang:
- lebih mudah digunakan
- dikelola oleh Google (dan bukan oleh Anda)
Jadi mungkin perlu dicoba. Dari dokumentasi kasar awal mereka (pdf) :
JDK memiliki ini:
String[] pieces = "foo.bar".split("\\.");
Tidak apa-apa untuk menggunakan ini jika Anda ingin apa yang dilakukannya: - ekspresi reguler - hasil sebagai array - cara menangani potongan kosong
Teka-teki mini: ", a ,, b,". Split (",") mengembalikan ...
(a) "", "a", "", "b", ""
(b) null, "a", null, "b", null
(c) "a", null, "b"
(d) "a", "b"
(e) None of the above
Jawab: (e) Tidak satu pun di atas.
",a,,b,".split(",")
returns
"", "a", "", "b"
Hanya Trailing Empty yang dilewati! (Siapa yang tahu solusinya untuk mencegah melewatkan? Ini yang menyenangkan ...)
Bagaimanapun, Splitter kami hanya lebih fleksibel: Perilaku default sederhana:
Splitter.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
Jika Anda ingin fitur tambahan, tanyakan!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
Urutan metode konfigurasi tidak masalah - selama pemisahan, pemangkasan terjadi sebelum memeriksa kekosongan.