Gunakan String.split () dengan beberapa pembatas


201

Saya perlu membagi basis string pada pembatas -dan .. Di bawah ini adalah output yang saya inginkan.

AA.BB-CC-DD.zip ->

AA
BB
CC
DD
zip 

tapi kode saya berikut ini tidak berfungsi.

private void getId(String pdfName){
    String[]tokens = pdfName.split("-\\.");
}

Berdasarkan apa yang Anda katakan, sepertinya itu berfungsi dengan baik. Apa output yang Anda inginkan?
Jeff

2
@ Jeff: Dia menunjukkan hasil yang diinginkannya ( AA/ BB/ CC...)
TJ Crowder

2
Apakah kamu yakin Saya menafsirkannya sebagai output saat ini, bukan output yang diinginkan. Mungkin sudah waktunya untuk berdiri dan berjalan sedikit.
Jeff

@ Jeff: Maaf atas kebingungan, saya memperbarui posting saya untuk menghapus kesalahpahaman Anda.
Thang Pham

Regex akan menurunkan kinerja Anda. Saya akan merekomendasikan menulis metode yang akan pergi karakter demi karakter dan membagi string jika perlu. Anda dapat mengoptimalkan ini lebih lanjut untuk mendapatkan kinerja log (n).
Princesh

Jawaban:


311

Saya pikir Anda perlu menyertakan regex ATAU operator :

String[]tokens = pdfName.split("-|\\.");

Apa yang Anda miliki akan cocok:
[DASH diikuti oleh DOT bersama] -.
bukan
[DASH atau DOT salah satunya] -atau.


9
mengapa kita membutuhkan dua backslash ??
pjain

7
The .karakter dalam regex berarti karakter lain selain baris baru. tutorialspoint.com/java/java_regular_expressions.htm Namun, dalam kasus ini, mereka menginginkan karakter yang sebenarnya .. Dua garis miring terbalik menunjukkan bahwa Anda merujuk .. Garis miring terbalik adalah karakter pelarian.
Monkeygrinder

2
untuk kasus-kasus normal .split("match1|match2"), (mis. split("https|http")), \\ adalah untuk melarikan diri char khusus .dalam kasus di atas
prayagupd

atau secara umum, Anda dapat menggunakan pdfName.split("\\W");seperti di bawah ini @Peter Knego menjawab
ahmednabil88

1
gunakan [-.]sebagai ganti-|\\.
Saeed

49

Coba regex ini "[-.]+". Tanda + setelah memperlakukan karakter pembatas berturut-turut sebagai satu. Hapus plus jika Anda tidak menginginkan ini.


8
@ Lurkers: Satu-satunya alasan Peter tidak harus melarikan diri -adalah karena itu adalah pemikiran pertama di dalam [], jika tidak perlu ada backslash di depannya (dan tentu saja, untuk meletakkan backslash di depannya, kami perlu dua karena ini adalah string literal).
TJ Crowder

Saya pikir jawaban ini lebih baik daripada yang diterima, karena ketika Anda menggunakan operator logika |, masalahnya adalah bahwa salah satu pembatas Anda dapat menjadi bagian dari 'token' hasil Anda. Ini tidak akan terjadi dengan Peter Knego [-.] +
Jack '

26

Anda dapat menggunakan regex "\ W". Ini cocok dengan karakter non-kata. Baris yang diperlukan adalah:

String[] tokens=pdfName.split("\\W");

itu tidak berfungsi untuk saya `String s =" id (INT), name (STRING), ". Menggunakan \\ W di sini membuat array dengan panjang 6 di mana seharusnya hanya 4
user3527975

2
Ini juga akan pecah ketika input berisi karakter Unicode. Yang terbaik hanya menyertakan pembatas yang sebenarnya, alih-alih "ambil semua" dengan \W.
nhahtdh

13

String yang Anda berikan splitadalah bentuk string dari ekspresi reguler, jadi:

private void getId(String pdfName){
    String[]tokens = pdfName.split("[\\-.]");
}

Itu berarti membagi karakter apa saja di dalam [](kita harus melarikan diri -dengan backslash karena itu spesial di dalamnya []; dan tentu saja kita harus melarikan diri dari backslash karena ini adalah string). (Sebaliknya, .biasanya spesial tetapi tidak spesial di dalam [].)


Anda tidak perlu lepas dari tanda hubung dalam kasus ini, karena [-.]tidak mungkin diartikan sebagai rentang.
Alan Moore

1
@Lan: Karena ini hal pertama di kelas, itu benar sekali. Tetapi saya selalu melakukannya, terlalu mudah untuk kembali lagi nanti dan menambahkan sesuatu di depannya tanpa berpikir. Melarikan diri tanpa biaya, jadi ...
TJ Crowder

apakah kamu tahu bagaimana cara melepaskan diri dari kurung? Saya memiliki String "[200] Engineering" yang ingin saya bagi menjadi "200", "Engineering"
scottysseus

3
Oh wow saya mengerti ... Saya harus menggunakan dua backslash, bukan satu. String[] strings = codes.get(x).split("\\[|\\]| ");<- kode untuk siapa pun yang tertarik
scottysseus

13

Menggunakan Jambu Biji, Anda bisa melakukan ini:

Iterable<String> tokens = Splitter.on(CharMatcher.anyOf("-.")).split(pdfName);

4

Untuk dua urutan char sebagai pembatas "AND" dan "OR" ini harus dikerjakan. Jangan lupa trim saat menggunakan.

 String text ="ISTANBUL AND NEW YORK AND PARIS OR TOKYO AND MOSCOW";
 String[] cities = text.split("AND|OR"); 

Hasil: kota = {"ISTANBUL", "NEW YORK", "PARIS", "TOKYO", "MOSCOW"}


Bagaimana saya bisa mendapatkan output seperti {"ISTANBUL AND", "NEW YORK AND", "PARIS OR", "TOKYO AND", "MOSCOW"}
Ahamadullah Saikat

3

Saya akan menggunakan Apache Commons:

impor org.apache.commons.lang3.StringUtils;

private void getId(String pdfName){
    String[] tokens = StringUtils.split(pdfName, "-.");
}

Itu akan terbelah pada pemisah yang ditentukan, sebagai lawan StringUtils.splitByWholeSeparator(str, separator)yang menggunakan string lengkap sebagai pemisah


3
String[] token=s.split("[.-]");

9
Tolong bantu melawan kesalahpahaman bahwa StackOverflow adalah layanan penulisan kode gratis, dengan menambah jawaban hanya kode Anda dengan beberapa penjelasan.
Yunnosch

2

Lebih baik menggunakan sesuatu seperti ini:

s.split("[\\s\\-\\.\\'\\?\\,\\_\\@]+");

Telah menambahkan beberapa karakter lain sebagai sampel. Ini adalah cara paling aman untuk digunakan, karena cara .dan 'perawatannya.


1

Anda juga dapat menentukan ekspresi reguler sebagai argumen dalam metode split () .. lihat contoh di bawah ini ....

private void getId(String pdfName){
String[]tokens = pdfName.split("-|\\.");
}

1

Coba kode ini:

var string = 'AA.BB-CC-DD.zip';
array = string.split(/[,.]/);

1
Tolong bantu melawan kesalahpahaman bahwa StackOverflow adalah layanan penulisan kode gratis, dengan menambah jawaban hanya kode Anda dengan beberapa penjelasan.
Yunnosch

0
s.trim().split("[\\W]+") 

harus bekerja.


2
Pertama, tidak, itu tidak berfungsi - mungkin Anda bisa mencobanya sebelum memposting? Maka jawaban ini sama dengan Anda - tetapi berfungsi. Akhirnya Anda harus memeriksa format Anda ( harus berfungsi. ).
Arount

1
Tolong bantu melawan kesalahpahaman bahwa StackOverflow adalah layanan penulisan kode gratis, dengan menambah jawaban hanya kode Anda dengan beberapa penjelasan.
Yunnosch

-1

Jika Anda tahu sengatannya akan selalu dalam format yang sama, pertama-tama pisahkan string berdasarkan .dan simpan string pada indeks pertama dalam sebuah variabel. Kemudian pisahkan string dalam indeks kedua berdasarkan -dan menyimpan indeks 0, 1 dan 2. Akhirnya, pisahkan indeks 2 dari array sebelumnya berdasarkan. dan Anda harus mendapatkan semua bidang yang relevan.

Lihat cuplikan berikut:

String[] tmp = pdfName.split(".");
String val1 = tmp[0];
tmp = tmp[1].split("-");
String val2 = tmp[0];
...

6
Itu bisa dilakukan dalam satu langkah, jadi lakukan dalam satu langkah. Lihat balasan lainnya.
Kaj

2
pdfName.split(".")menghasilkan array dengan panjang nol.
Alan Moore

1) .Perlu diloloskan sebagai\\.
Shri
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.