Enumerable çünkü StringTokenizer fikrini seviyorum.
Ama aynı zamanda eski ve sıkıcı bir String [] döndüren String.split ile değiştirilir (ve ayırıcıları içermez).
Bu yüzden bir Yinelenebilir ve bir dize bölmek için gerçek bir regexp alır bir StringTokenizerEx uyguladı.
Gerçek bir normal ifade, sınırlayıcıyı oluşturmak için tekrarlanan bir 'Karakter dizisi' olmadığı anlamına gelir:
'o' yalnızca 'o' ile eşleşir ve 'ooo'yu içinde iki boş dize olacak şekilde üç ayırıcıya böler:
[o], '', [o], '', [o]
Ancak regexp o +, "aooob" kelimesini böldüğünde beklenen sonucu döndürür
[], 'a', [ooo], 'b', []
Bu StringTokenizerEx'i kullanmak için:
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();
}
Bu sınıfın kodu DZone Snippet'lerinde mevcuttur .
Her zaman olduğu gibi, bir kod meydan okuma yanıtı (test senaryoları dahil bir bağımsız sınıf), kopyalayıp yapıştırın ('src / test' dizininde) ve çalıştırın . Onun main () yöntemi farklı kullanımları gösterir.
Not: (2009 sonu)
Son Düşünceler: Java Puzzler: Splits Hairs makalesinde tuhaf davranışı açıklamak için iyi bir iş çıkarıyor String.split().
Josh Bloch bu makaleye yanıt olarak bile yorum yaptı:
Evet, bu bir acı. FWIW, çok iyi bir nedenden dolayı yapıldı: Perl ile uyumluluk.
Bunu yapan kişi şu anda Google'da bizimle çalışan Mike "madbot" McCloskey. Mike, Java'nın düzenli ifadelerinin neredeyse 30K Perl düzenli ifade testlerinin her birini geçtiğinden (ve daha hızlı çalıştığından) emin oldu.
Google ortak kütüphanesi Guava ayrıca bir Ayırıcı içerir:
- kullanımı daha basit
- Google tarafından korunur (sizin tarafınızdan değil)
Bu yüzden kontrol edilmeye değer olabilir. Bunların kaynaktan ilk kaba belgeleri (pdf) :
JDK'da şunlar var:
String[] pieces = "foo.bar".split("\\.");
Tam olarak ne yaptığını istiyorsanız bunu kullanmak iyi olur: - normal ifade - bir dizi olarak sonuç - boş parçaları işleme şekli
Mini bilinmez: ", a ,, b,". Split (",") döndürür ...
(a) "", "a", "", "b", ""
(b) null, "a", null, "b", null
(c) "a", null, "b"
(d) "a", "b"
(e) None of the above
Cevap: (e) Yukarıdakilerin hiçbiri.
",a,,b,".split(",")
returns
"", "a", "", "b"
Sadece sondaki boşluklar atlanır! (Atlamayı önlemek için geçici çözümü kim bilebilir? Eğlenceli bir çözüm ...)
Her durumda, Splitter'ımız sadece daha esnektir: Varsayılan davranış basittir:
Splitter.on(',').split(" foo, ,bar, quux,")
--> [" foo", " ", "bar", " quux", ""]
Ekstra özellikler istiyorsanız, bunları isteyin!
Splitter.on(',')
.trimResults()
.omitEmptyStrings()
.split(" foo, ,bar, quux,")
--> ["foo", "bar", "quux"]
Yapılandırma yöntemlerinin sırası önemli değildir - bölme sırasında, boşaltma olup olmadığını kontrol etmeden önce kırpma yapılır.