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?


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


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.


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 + "<");
    }
}

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

1

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

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


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


-2

metode split () mengambil ekspresi reguler sebagai argumen

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.