Memisahkan String Java dengan simbol pipa menggunakan split ("|")

195

Dokumentasi resmi Java menyatakan:

String "boo:and:foo", misalnya, menghasilkan hasil berikut dengan ekspresi ini Hasil Regex:

{ "boo", "and", "foo" }"

Dan itulah cara saya membutuhkannya untuk bekerja. Namun, jika saya menjalankan ini:

public static void main(String[] args){
        String test = "A|B|C||D";

        String[] result = test.split("|");

        for(String s : result){
            System.out.println(">"+s+"<");
        }
    }

itu mencetak:

><
>A<
>|<
>B<
>|<
>C<
>|<
>|<
>D<

Yang jauh dari yang saya harapkan:

>A<
>B<
>C<
><
>D<

Mengapa ini terjadi?

bluehallu
sumber
2
Kemungkinan rangkap dari Cara memecah string di Jawa
KIBOU Hassan

Jawaban:

423

Kamu butuh

test.split("\\|");

splitmenggunakan ekspresi reguler dan dalam regex | adalah metacharacter yang mewakili ORoperator. Anda perlu melarikan diri dari karakter yang menggunakan \(ditulis dalam String karena "\\"sejak \itu juga merupakan metacharacter dalam String literal dan memerlukan yang lain \untuk menghindarinya).

Anda juga bisa menggunakan

test.split(Pattern.quote("|"));

dan biarkan Pattern.quotemembuat versi lolos dari regex yang mewakili |.

Jigar Joshi
sumber
17
Yaitu, split()metode mengambil regex dan |merupakan karakter khusus untuk reg ex
Jigar Joshi
1
Anda adalah pilihan kedua saya sebagai moderator di stack overflow. Semua yang terbaik.
Däñish Shärmà
33

Gunakan melarikan diri dengan benar: string.split("\\|")

Atau, di Java 5+, gunakan helper Pattern.quote()yang telah dibuat untuk tujuan ini:

string.split(Pattern.quote("|"))

yang bekerja dengan string input yang berubah-ubah. Sangat berguna saat Anda perlu mengutip / melarikan diri input pengguna.

Aaron Digulla
sumber
3
Bukan shure ketika transisi dibuat, tetapi di Java 8, orang akan menggunakan Pattern.quote().
RAnders00
4

Gunakan kode ini:

public static void main(String[] args) {
    String test = "A|B|C||D";

    String[] result = test.split("\\|");

    for (String s : result) {
        System.out.println(">" + s + "<");
    }
}
berliandi
sumber
Solusi ini sudah ditunjukkan oleh jawaban yang diterima. Tidak perlu mengulanginya.
Pshemo
3

Anda juga bisa menggunakan pustaka apache dan melakukan ini:

StringUtils.split(test, "|");
Simon
sumber
1

Anda juga bisa menggunakan .split("[|]") .

(Saya menggunakan ini sebagai gantinya .split("\\|"), yang tidak bekerja untuk saya.)

Homer
sumber
Kedua versi harus berfungsi dengan baik. Jika salah satu tidak menyarankan masalah ada di tempat lain.
Pshemo
@Pshemo Namun ini menambahkan rasa yang menarik, bahwa beberapa simbol yang dipesan tidak harus diloloskan jika dimasukkan ke dalam tanda kurung.
Pax Vobiscum
0
test.split("\\|",999);

Menentukan batas atau maks akan akurat untuk contoh seperti: "boo ||| a" atau "|| boo |" atau "|||"

Tetapi test.split("\\|");akan mengembalikan array string panjang yang berbeda untuk contoh yang sama.

gunakan referensi: tautan

Ryan Augustine
sumber
-2

metode split () mengambil ekspresi reguler sebagai argumen

Badai
sumber