Saya hanya melihat solusi di sini tetapi tidak ada penjelasan lengkap tentang masalahnya, jadi saya memutuskan untuk memposting jawaban ini
Masalah
Anda perlu mengetahui beberapa hal tentang text.split(delim)
. split
metode:
- menerima sebagai ekspresi reguler argumen (regex) yang mendeskripsikan pembatas yang ingin kita pisahkan,
- jika
delim
ada di akhir text
like in a,b,c,,
( di mana pembatasnya ,
) split
pada awalnya akan membuat array seperti ["a" "b" "c" "" ""]
tetapi karena dalam kebanyakan kasus kita tidak benar-benar membutuhkan string kosong ini, ia juga menghapusnya secara otomatis untuk kita. Jadi itu membuat array lain tanpa string kosong ini dan mengembalikannya .
Perlu Anda ketahui juga bahwa titik.
merupakan karakter khusus pada regex . Ini mewakili karakter apa pun (kecuali pemisah baris tetapi ini dapat diubah dengan Pattern.DOTALL
bendera).
Jadi untuk string seperti "abc"
jika kita split pada "."
split
method will
- buat array seperti
["" "" "" ""]
,
- tetapi karena array ini hanya berisi string kosong dan semuanya tertinggal, mereka akan dihapus (seperti yang ditunjukkan pada poin kedua sebelumnya)
yang berarti kita akan mendapatkan array kosong hasil []
(tanpa elemen, bahkan string kosong), jadi kita tidak bisa menggunakan fn[0]
karena tidak ada indeks 0.
Larutan
Untuk mengatasi masalah ini Anda hanya perlu membuat regex yang akan mewakili titik. Untuk melakukannya kita perlu menghindarinya .
. Ada beberapa cara untuk melakukannya, tetapi yang paling sederhana adalah dengan menggunakan \
(yang dalam String perlu ditulis "\\"
karena di \
sana juga khusus dan memerlukan cara lain \
untuk di-escape).
Jadi solusi untuk masalah Anda mungkin terlihat seperti ini
String[] fn = filename.split("\\.");
Bonus
Anda juga dapat menggunakan cara lain untuk menghindari titik seperti itu
- menggunakan kelas karakter
split("[.]")
- membungkusnya dengan kutipan
split("\\Q.\\E")
- menggunakan contoh Pola yang tepat dengan
Pattern.LITERAL
bendera
- atau cukup gunakan
split(Pattern.quote("."))
dan biarkan regex lolos untuk Anda.