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). splitmetode:
- menerima sebagai ekspresi reguler argumen (regex) yang mendeskripsikan pembatas yang ingin kita pisahkan,
- jika
delimada di akhir textlike in a,b,c,,( di mana pembatasnya ,) splitpada 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.DOTALLbendera).
Jadi untuk string seperti "abc"jika kita split pada "." splitmethod 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.LITERALbendera
- atau cukup gunakan
split(Pattern.quote("."))dan biarkan regex lolos untuk Anda.