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)
. split
yö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
delim
sonunda mevcut text
olduğu gibi a,b,c,,
(ayırıcı olduğu ,
) split
gibi 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.DOTALL
bayrakla değiştirilebilir ).
Öyleyse dize "abc"
için "."
split
yö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.LITERAL
bayrakla kullanma
- veya basitçe kullanın
split(Pattern.quote("."))
ve normal ifadenin sizin için kaçmasına izin verin.