Saya bertanya-tanya apakah saya akan memisahkan string .
dengan cara yang benar? Kode saya adalah:
String[] fn = filename.split(".");
return fn[0];
Saya hanya perlu bagian pertama dari string, itulah mengapa saya mengembalikan item pertama. Saya bertanya karena saya perhatikan di API yang .
berarti karakter apa saja, jadi sekarang saya macet.
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:delim
ada di akhirtext
like ina,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 denganPattern.DOTALL
bendera).Jadi untuk string seperti
"abc"
jika kita split pada"."
split
method will["" "" "" ""]
,yang berarti kita akan mendapatkan array kosong hasil
[]
(tanpa elemen, bahkan string kosong), jadi kita tidak bisa menggunakanfn[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
Bonus
Anda juga dapat menggunakan cara lain untuk menghindari titik seperti itu
split("[.]")
split("\\Q.\\E")
Pattern.LITERAL
benderasplit(Pattern.quote("."))
dan biarkan regex lolos untuk Anda.sumber
split("[.]")
metode String # split (String) menggunakan ekspresi reguler. Dalam ekspresi reguler, "." karakter berarti "karakter apa saja". Anda dapat menghindari perilaku ini dengan keluar dari "."
atau memberi tahu metode pemisahan untuk memisahkan di kelas karakter:
Kelas karakter adalah kumpulan karakter. Anda bisa menulis
dan nama file akan dibagi di setiap "-", ".", ";", "l", "d" atau "7". Di dalam kelas karakter, "." bukan karakter khusus ("metacharacter").
sumber
Karena DOT (.) Dianggap sebagai karakter khusus dan metode pemisahan String mengharapkan ekspresi reguler yang perlu Anda lakukan seperti ini -
Di java, karakter khusus perlu di-escape dengan "\" tetapi karena "\" juga merupakan karakter khusus di Java, Anda perlu menghindarinya lagi dengan "\" yang lain!
sumber
sumber
Bukankah lebih efisien untuk digunakan
jika Anda hanya ingin apa yang sampai titik pertama?
sumber
Biasanya BUKAN ide yang baik untuk membuka kedoknya dengan tangan. Ada metode di kelas Pola untuk tugas ini:
sumber
Pemisahan harus menggunakan ekspresi reguler sebagai argumen ... Cukup ubah
"."
ke"\\."
sumber
Catatan: Cuplikan ini harus lebih berhati-hati, bahkan setelah titik hilang!
Jika nama file hanya berupa string ".", Maka fn akan tetap memiliki panjang 0 dan fn [0] masih akan mengeluarkan pengecualian!
Ini karena jika polanya cocok setidaknya sekali, maka split akan membuang semua string kosong yang tertinggal (demikian juga string sebelum titik!) Dari larik, meninggalkan larik kosong untuk dikembalikan.
sumber
Solusi yang berhasil untuk saya adalah sebagai berikut
sumber
Menggunakan ApacheCommons itu paling sederhana:
Catatan, ini juga mengekstrak nama file dari jalur lengkap.
sumber
split
mengambil regex sebagai argumen. Jadi, Anda harus lulus,"\."
bukan"."
karena"."
merupakan metakarakter di regex.sumber