2010-04-28 15 views
5

Bir girdi dizesini virgül, yarı-virgül veya beyaz boşluk (veya üçünün bir karışımı) ile bölebilmem gerekir. Aynı zamanda girişteki çoklu ardışık sınırlayıcıları tek bir sınırlayıcı olarak ele almak istiyorum. İşte ben bugüne kadar ne var:String.split() - ilk sınırlayıcıdan önceki önde gelen boş String ile eşleşen?

String regex = "[,;\\s]+";  
return input.split(regex); 

Bu giriş dizesi sonuç dizinin ilk elemanı boş bir dize olduğu bu durumda, ayırıcı karakterlerden biriyle başladığında dışında çalışır. Sonuçumun boş Dizeler olmasını istemiyorum, öyle ki ",,,, ZERO;;; ONE, TWO ;," gibi bir şey, büyük harfli Dizeleri içeren yalnızca üç öğe dizisini döndürür.

Bunu yapmak için String.split'i çağırmadan önce reg-ex'imle eşleşen herhangi bir öncü karakter çıkarmaktan daha iyi bir yolu var mı?

Şimdiden teşekkürler!

+0

Java regex API'sini hatırlamıyorum gibi bir yanıt olarak gönderilmiyor, ancak sınırlayıcılara ayırmak yerine sınırlayıcı olmayan dizeleri arayabilirsin. [^,; \ s] + 'gibi bir regex kullanarak. –

+0

Görünüşte aynı soru, daha yeni ama daha iyi kabul edilen cevap: https://stackoverflow.com/questions/9389503/how-to-prevent-java-lang-string-split-from-creating-a-leading-empty-string –

cevap

3

"daha iyi" demek, daha yüksek performans demektir, o zaman, eşleşmek istediğinizle eşleşen ve Matcher.find'u bir döngüde kullanan ve bunları bulduğunuz şekilde eşleştiren düzenli bir ifade oluşturmayı deneyebilirsiniz. Bu, ilk önce dizgiyi değiştirmeyi sağlar. Ancak, verileriniz için hangisinin daha hızlı olduğunu görmek için kendiniz ölçün.

"Daha iyi" ile daha basit bir deyim varsa, o zaman önermiş olduğunuzdan daha basit bir yol olduğunu düşünmüyorum: bölünmeyi uygulamadan önce önde gelen ayırıcıları çıkartın. ancak, ayrı her bir potansiyel boşluk karakteri tanımlamak gerekir, Bir uyarı

StringTokenizer st = new StringTokenizer(",,,ZERO;,ONE TWO", ",; ", false); 
while(st.hasMoreTokens()) { 
    String str = st.nextToken(); 
    //add to list, process, etc... 
} 

:

6

Hayır, yok. Yalnızca String'in bölünmeye ikinci parametre olarak 0 sağlayarak sınırlayıcıları sondaki görmezden olabilir() yöntemi:

return input.split(regex, 0); 

ama sınırlayıcılar lider için, önce onları soymak gerekecek: ediyorsan

return input.replaceFirst("^"+regex, "").split(regex, 0); 
+0

Negatif bir parametre mi? Eğer n sıfır ise, desen mümkün olduğunca çok kez uygulanır, dizi herhangi bir uzunlukta olabilir ve boş dizgiler takip edilir. 'Http://java.sun.com/javase/6/docs/ api/java/lang/String.html # split% 28java.lang.String,% 20int% 29 –

+0

Whoops, evet, demek istedim 0. Teşekkürler! Düzeltmek için –

+0

+1 –

1

Ayrıca potansiyel olarak onunla yapmanız gerekenler bağlı listesi oluşturmak için StringTokenizer kullanabilirsiniz kurucuya ikinci argüman.

2

JDK içine yerleştirilen bölme tesislerinin hemen hemen hepsi bir şekilde bozulur. Bir üçüncü taraf boş belirteçleri ve boşlukları nasıl işleyeceğini esnek ve doğru hem sınıf gibi Splitter kullanılarak daha iyi olurdu:

Splitter.on(CharMatcher.anyOf(";,").or(CharMatcher.WHITESPACE)) 
    .omitEmptyStrings() 
    .split(",,,ZERO;,ONE TWO"); 

"ZERO" içeren bir iterable < String> verecektir, "BIR", "İKİ"

İlgili konular