Pisahkan string dengan titik sebagai pembatas

99

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.

Dekan
sumber

Jawaban:

173

split()menerima ekspresi reguler, jadi Anda perlu keluar .untuk tidak menganggapnya sebagai karakter meta ekspresi reguler. Berikut contohnya:

String[] fn = filename.split("\\."); 
return fn[0];
Marimuthu Madasamy
sumber
17

Pisahkan menggunakan ekspresi reguler, di mana '.' adalah karakter khusus yang berarti apa saja. Anda harus menghindarinya jika Anda benar-benar ingin itu cocok dengan '.' karakter:

String[] fn = filename.split("\\.");

(satu '\' untuk mengosongkan '.' dalam ekspresi reguler, dan yang lainnya untuk mengonversi yang pertama dalam string Java)

Juga saya tidak menyarankan mengembalikan fn [0] karena jika Anda memiliki nama file something.blabla.txt, yang merupakan nama yang valid, Anda tidak akan mengembalikan nama file yang sebenarnya. Sebaliknya saya pikir lebih baik jika Anda menggunakan:

int idx = filename.lastIndexOf('.');
return filename.subString(0, idx);
Andrei Fierbinteanu
sumber
Pertanyaannya adalah Java, bukan Javascript, yang Anda tautkan.
Andrei Fierbinteanu
17

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:

  1. menerima sebagai ekspresi reguler argumen (regex) yang mendeskripsikan pembatas yang ingin kita pisahkan,
  2. 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

  1. buat array seperti ["" "" "" ""],
  2. 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.
Pshemo
sumber
ini .. Saya sangat suka: split("[.]")
Dragonborn
15

metode String # split (String) menggunakan ekspresi reguler. Dalam ekspresi reguler, "." karakter berarti "karakter apa saja". Anda dapat menghindari perilaku ini dengan keluar dari "."

filename.split("\\.");

atau memberi tahu metode pemisahan untuk memisahkan di kelas karakter:

filename.split("[.]");

Kelas karakter adalah kumpulan karakter. Anda bisa menulis

filename.split("[-.;ld7]");

dan nama file akan dibagi di setiap "-", ".", ";", "l", "d" atau "7". Di dalam kelas karakter, "." bukan karakter khusus ("metacharacter").

f1sh
sumber
@MisterSmith Anda mungkin ingin melihat bahasa pemrograman di sini. Kita berbicara tentang java, bukan javascript.
f1sh
Anda benar sekali. Saya lelah kemarin, karena sedang membuat kode dalam kedua bahasa, tidak memperhatikan tipe data Java. Saya pikir mungkin jawabannya benar pada tahun 2010 tetapi entah bagaimana browser saat ini berperilaku dengan cara yang berbeda.
Mister Smith
7

Karena DOT (.) Dianggap sebagai karakter khusus dan metode pemisahan String mengharapkan ekspresi reguler yang perlu Anda lakukan seperti ini -

String[] fn = filename.split("\\.");
return fn[0];

Di java, karakter khusus perlu di-escape dengan "\" tetapi karena "\" juga merupakan karakter khusus di Java, Anda perlu menghindarinya lagi dengan "\" yang lain!

Neel
sumber
3
String str="1.2.3";
String[] cats = str.split(Pattern.quote("."));
Magnus Persson
sumber
2

Bukankah lebih efisien untuk digunakan

 filename.substring(0, filename.indexOf("."))

jika Anda hanya ingin apa yang sampai titik pertama?

Martin Smith
sumber
2

Biasanya BUKAN ide yang baik untuk membuka kedoknya dengan tangan. Ada metode di kelas Pola untuk tugas ini:

java.util.regex
static String quote(String s) 
Christian Ullenboom
sumber
1

Pemisahan harus menggunakan ekspresi reguler sebagai argumen ... Cukup ubah "."ke"\\."

Bob Fincheimer
sumber
0

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.

avl42
sumber
solusi termudah dalam kasus seperti yang ada adalah juga mengirimkan argumen-batas 2 ke panggilan untuk memisahkan: String [] fn = namafile.split ("[.]", 2);
avl42
0

Solusi yang berhasil untuk saya adalah sebagai berikut

filename.split ("[.]");

jorge santos
sumber
0

Menggunakan ApacheCommons itu paling sederhana:

File file = ...
FilenameUtils.getBaseName(file.getName());

Catatan, ini juga mengekstrak nama file dari jalur lengkap.

Nikita
sumber
-2

splitmengambil regex sebagai argumen. Jadi, Anda harus lulus, "\."bukan "."karena "."merupakan metakarakter di regex.

Vijay Mathew
sumber