Burada yalnızca çözümleri görüyorum, ancak sorunun tam açıklaması yok, bu yüzden bu yanıtı göndermeye karar verdim
Sorun
Hakkında birkaç şey bilmen gerekiyor text.split(delim). splityöntem:
- ayırmak istediğimiz sınırlayıcıyı tanımlayan bağımsız değişken düzenli ifade (regex) olarak kabul eder ,
- eğer
delimsonunda mevcut textolduğu gibi a,b,c,,(ayırıcı olduğu ,) splitgibi dizi yaratacaktır ilk başta ["a" "b" "c" "" ""]ama bu yana çoğu durumda biz gerçekten de bizim için bunları otomatik olarak kaldırır bu sondaki boş dizeleri gerekmez. Böylece , bu sondaki boş dizeler olmadan başka bir dizi oluşturur ve onu döndürür .
Ayrıca bilmek gerekir nokta. olduğunu özel karakter de regex . Herhangi bir karakteri temsil eder (satır ayırıcılar hariç ancak bu Pattern.DOTALLbayrakla değiştirilebilir ).
Öyleyse dize "abc"için "." splityönteme bölünürsek
- gibi dizi oluştur
["" "" "" ""],
- ancak bu dizi yalnızca boş dizeler içerdiğinden ve hepsi sonda olduğundan, kaldırılacaklar (önceki ikinci noktada gösterildiği gibi)
Bu, sonuç olarak boş bir dizi alacağımız anlamına gelir [](hiç eleman olmadan, boş dizge bile olmadan), bu yüzden kullanamayız fn[0]çünkü 0 indisi yok.
Çözüm
Bu sorunu çözmek için noktayı temsil edecek bir normal ifade oluşturmanız yeterlidir. Bunu yapmak için bundan kaçmalıyız .. Bunu yapmanın birkaç yolu vardır, ancak en basiti muhtemelen kullanmaktır \(String'de yazılması gerekir "\\"çünkü \burada da özeldir ve başka \birinin kaçmasını gerektirir ).
Yani probleminizin çözümü şöyle görünebilir:
String[] fn = filename.split("\\.");
Bonus
Bu noktadan kaçmak için başka yollar da kullanabilirsiniz.
- karakter sınıfını kullanma
split("[.]")
- alıntıya sarmak
split("\\Q.\\E")
- uygun Desen örneğini
Pattern.LITERALbayrakla kullanma
- veya basitçe kullanın
split(Pattern.quote("."))ve normal ifadenin sizin için kaçmasına izin verin.