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.

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];

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);

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.

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").


@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!



2

Bukankah lebih efisien untuk digunakan

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

jika Anda hanya ingin apa yang sampai titik pertama?


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) 

1

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


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.


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 ("[.]");


0

Menggunakan ApacheCommons itu paling sederhana:

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

Catatan, ini juga mengekstrak nama file dari jalur lengkap.


-2

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.