Java String bölünmüş boş değerleri kaldırdı


286

Bir ayırıcı kullanarak değeri bölmek çalışıyorum. Ama şaşırtıcı sonuçlar buluyorum

String data = "5|6|7||8|9||";
String[] split = data.split("\\|");
System.out.println(split.length);

8 değer almayı bekliyorum. [5,6,7, BOŞ, 8,9, BOŞ, BOŞ] Ama sadece 6 değer alıyorum.

Herhangi bir fikir ve nasıl düzeltilir. EMPTY değeri herhangi bir yerde olursa olsun, dizide olmalıdır.

Yanıtlar:


493

split(delimiter)varsayılan olarak sondaki boş dizeleri sonuç dizisinden kaldırır. Biz aşırı yüklü sürümünü kullanmak gerekir kapalı bu mekanizmayı açmak için split(delimiter, limit)birlikte limitgibi negatif değere seti

String[] split = data.split("\\|", -1);

Biraz daha ayrıntı: Bu yöntemin
split(regex)dahili olarak sonucunu split(regex, 0)ve dokümantasyonunda bulabilirsiniz (benimkini vurgulayın)

limitParametre desen uygulandığında sayısını kontrol eder ve bu nedenle elde edilen dizinin uzunluğunu da etkiler.

Sınırı ise nbir sıfırdan büyük sonra model en n olacak şekilde uygulanacaktır - 1 defa, dizi uzunluğu n daha büyük olacak ve dizinin son giriş son eşleşen sınırlayıcı ötesinde tüm giriş içerir.

Eğer nbir pozitif olmayan sonra model mümkün olduğu kadar çok kez tatbik edilecektir ve dizi herhangi bir uzunlukta olabilir.

Eğer nisimli sıfır sonra model mümkün olduğu kadar çok kez tatbik edilecektir, dizi herhangi bir uzunlukta olabilir ve boş dizeleri arka atılır .

İstisna :

Sondaki boş dizgenin kaldırılmasının, yalnızca bu tür boş dizeler eşyasının bölünmüş mekanizma tarafından yaratılması durumunda mantıklı olduğunu belirtmek gerekir . Bu yüzden daha "".split(anything)fazla bölünemediğimiz ""için sonuç [""]dizisi olarak alacağız .
Bunun nedeni bölünmenin burada olmamasıdır, bu nedenle ""boş ve sondaki nokta , bölünme işlemi tarafından oluşturulan boş dizeyi değil, orijinal dizgiyi temsil eder .


2
vay. çok zekice çalıştı. ama -1 bu her şeyi nasıl değiştirir?
Reddy

1
hatta deneyebilirsinizdata.split("\\|", 8)
Subhrajyoti Majumder

23
Kullanmayın split("\\|", 8)çünkü bu ilk sekiz jetonla sınırlıdır! Senin dize değişkeni ise, kullanması gereken split("\\|", -1)o jeton sınırsız sayıda oluşturur ve böylece değil sonunda atma boş belirteçleri.
ADTC

2
@Reddy -1 ( ya da aslında herhangi bir negatif sayı, mutlak değerin ne olduğu önemli değildir ) split yöntemine boş belirteçleri sonunda tutmasını söyler. Varsayılan değer, yöntemin dizinin sonunda boş belirteçleri atmasını bildiren 0'dır.
ADTC

8
Görünüşe göre, birçok insan, sondaki boş dizeleri tutmanın varsayılan işlevsellik olmasını bekliyordu split(regex). Buraya geldiler ve olmadığını öğrendiler.
Attila Tanyi

32

Aşağıdakilerin dokümantasyonundan String.split(String regex):

Bu yöntem, iki değişkenli split yöntemini verilen ifade ve sıfır sınır argümanı ile çağırarak çalışır. Bu nedenle, izleyen boş dizeler sonuçta elde edilen diziye dahil edilmez.

Bu nedenle, iki bağımsız değişken sürümünü String.split(String regex, int limit)negatif bir değerle kullanmanız gerekir:

String[] split = data.split("\\|",-1);

Doktor:

N sınırı sıfırdan büyükse, desen en fazla n - 1 kez uygulanır, dizinin uzunluğu n'den büyük olmaz ve dizinin son girdisi son eşleşen sınırlayıcının ötesindeki tüm girdileri içerir. N pozitif değilse desen mümkün olduğunca çok uygulanır ve dizi herhangi bir uzunluğa sahip olabilir. N sıfırsa, desen mümkün olduğunca çok kez uygulanır, dizi herhangi bir uzunluğa sahip olabilir ve sondaki boş dizeler atılır.

Bu, sondaki olanlar da dahil olmak üzere boş öğeler bırakmaz.


4

Gönderen String.split () API Doc :

Bu dizeyi verilen normal ifadenin eşleşmelerine böler. Bu yöntem, iki değişkenli split yöntemini verilen ifade ve sıfır limit argümanı ile çağırarak çalışır. Bu nedenle, izleyen boş dizeler sonuçta elde edilen diziye dahil edilmez.

Aşırı yüklenmiş String.split (regex, int) sizin durumunuz için daha uygundur.


1
Bu davranışı açıklar ancak soruyu cevaplamaz.
asililer

@assylias cevabımı şimdi ekledi :)
PermGenError

4

String[] split = data.split("\\|",-1);

Bu her zaman asıl gereklilik değildir. Yukarıdaki dezavantaj aşağıda gösterilmiştir:

Scenerio 1:
When all data are present:
    String data = "5|6|7||8|9|10|";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 7
    System.out.println(splt.length); //output: 8

Veriler eksik olduğunda:

Scenerio 2: Data Missing
    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output: 8

Gerçek gereksinim, veri eksik olmasına rağmen uzunluk 7 olmalıdır. Çünkü ne zaman veritabanına veya başka bir şey eklemek gerekir gibi durumlar vardır. Bunu aşağıdaki yaklaşımı kullanarak başarabiliriz.

    String data = "5|6|7||8|||";
    String[] split = data.split("\\|");
    String[] splt = data.replaceAll("\\|$","").split("\\|",-1);
    System.out.println(split.length); //output: 5
    System.out.println(splt.length); //output:7

Burada yaptığım şey, "|" Sonunda boru ve sonra Dize bölün. Bir ayırıcı olarak "," varsa, replaceAll içine ", $" eklemeniz gerekir.


1

boşluk karakterleri, virgül, noktalı virgül vb. dahil olmak üzere birden çok ayırıcıya sahip olabilirsiniz. [] + ile tekrarlanabilir gruptakileri alın:

 String[] tokens = "a , b,  ,c; ;d,      ".split( "[,; \t\n\r]+" );

4 jetonunuz olacak - a, b, c, d

bu bölünme uygulanmadan önce kaynak dizgideki önde gelen ayırıcıların kaldırılması gerekir.

sorulan soruya cevap olarak:

String data = "5|6|7||8|9||";
String[] split = data.split("[\\| \t\n\r]+");

ile birlikte ayırıcı olarak sahip olmanız durumunda beyaz boşluklar eklendi |

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.