Bagaimana cara membagi string JavaScript dengan spasi atau koma?

123

Jika saya mencoba

"my, tags are, in here".split(" ,")

Saya mendapatkan yang berikut ini

[ 'my, tags are, in here' ]

Padahal saya mau

['my', 'tags', 'are', 'in', 'here']
Hoa
sumber
4
bukankah maksud Anda spasi atau koma?
KaptajnKold
1
Sebagai penjelasan untuk hasil yang Anda dapatkan: "my, tags are, in here".split(" ,")akan memisahkan string hanya di mana spasi diikuti oleh koma adalah pemisah. String Anda tidak mengandung urutan itu, oleh karena itu tidak dipisahkan. "my, tags are, in here".split(", ")dengan urutan pemisahan yang ditukar setidaknya akan membagi string asli Anda menjadi tiga bagian, setelah setiap koma-dan-spasi. Jika Anda menginginkan lima bagian, jawaban di bawah menentukan string yang cocok sebagai ekspresi reguler yang cocok dengan spasi atau koma.
Jochem Schulenklopper

Jawaban:

233

String.split juga dapat menerima ekspresi reguler:

input.split(/[ ,]+/);

Regex khusus ini terbagi atas urutan satu atau lebih koma atau spasi, sehingga misalnya beberapa spasi berurutan atau urutan spasi koma + tidak menghasilkan elemen kosong dalam hasil.

Jon
sumber
22
Tentang apa /,?\s+/?
Bergi
4
@Bergi: Baik, keduanya lebih ketat dari yang saya sarankan (hanya diperbolehkan satu koma, di depan) dan lebih longgar (dipisahkan di semua spasi) daripada yang diminta OP. IMHO akan lebih buruk - pertimbangkan masukan spaces , before commas.
Jon
@ Jon: Oke, itu tergantung pada kebutuhan OP. Saya tidak akan plenk :-)
Bergi
11
+1 Saya tahu ini agak tua tapi mengapa menggunakan ruang kosong dan tidak \s. Saya mungkin memiliki beberapa jeda baris di gumpalan dan \smengurusnya juga.
iambriansreed
6
CATATAN FACEPALM: jangan beri tanda petik di sekitar regex. mis. Jangan gunakan input.split("/[ ,]+/)". Tinggalkan kutipan (input.split(//) bukan input.split("//")) dan Anda akan memiliki pengalaman yang jauh lebih baik. Karena anehnya, itu mungkin hanya akan bekerja pada dirinya sendiri (untuk menghasilkan ["input.split(\"", ")\""]).
cod3monk3y
41

Saran yang digunakan .split(/[ ,]+/)bagus, tetapi dengan kalimat alami cepat atau lambat Anda akan mendapatkan elemen kosong dalam array. misalnya['foo', '', 'bar'] .

Tidak masalah jika tidak masalah untuk kasus penggunaan Anda. Tetapi jika Anda ingin menghilangkan elemen kosong, Anda dapat melakukan:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);
jonschlinkert
sumber
6
Itu adalah penggunaan yang sangat cerdik dari konstruktor implisit objek asli- keyboard komputer saya gila pagi ini- Saya akan mengedit komentar ini nanti- tetapi poin yang memanggil Boolean seperti 'Boolean ()' akan membuat instance baru [objek Boolean] dengan nilai false, sama seperti memanggil 'new Boolean ()'. Itu akan menyaring semua kecocokan ke perilaku default ini. Bagus :)
VLostBoy
apa sebenarnya yang Anda maksud dengan "kalimat alami"? Saya tidak bisa menirunya dan saya juga tidak mengerti apa yang seharusnya dilakukan ini.
Cregox
Ini dijelaskan oleh @VLostBoy. Ketika Boolean()konstruktor dipanggil pada nilai apa pun, konstruktor akan mentransmisikan nilai itu ke boolean - true atau false. Dengan demikian, nilai yang salah akan difilter dari larik, termasuk string kosong.
jonschlinkert
1
btw, Anda dapat menggunakan konstruktor implisit untuk hal menyenangkan serupa lainnya, seperti[1, 2, 3].map(String)
jonschlinkert
2
"foo, bar,,foobar,".split(/[\s,]+/)kembali ["foo", "bar", "foobar", ""](karena koma yang menjuntai di akhir), terima kasih!
Rafał Cieślak
37

Anda dapat menggunakan regex untuk menangkap berapa pun ruang kosong, dan ini akan seperti:

var text = "hoi how     are          you";
var arr = text.split(/\s+/);

console.log(arr) // will result : ["hoi", "how", "are", "you"]

console.log(arr[2]) // will result : "are" 
Cemil Dogan
sumber
Berhati-hatilah di depan / di belakang spasi saat menggunakan /\s+/. Misalnya 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ],. Jika Anda .trim()yang duluan, Anda akan menjadi baik.
Jordan Dodson
12
"my, tags are, in here".split(/[ ,]+/)

hasilnya adalah :

["my", "tags", "are", "in", "here"]
gabitzish
sumber
4

input.split(/\s*[\s,]\s*/)

\s*Mencocokkan nol atau lebih karakter spasi (bukan hanya spasi, tetapi juga tab dan baris baru).

... [\s,]cocok dengan satu karakter spasi putih atau satu koma

Jika Anda ingin menghindari elemen kosong dari input seperti "foo,bar,,foobar", ini akan melakukan triknya:

input.split(/(\s*,?\s*)+/)

The +cocok dengan salah satu atau lebih dari karakter sebelumnya atau kelompok.

Edit:

Ditambahkan ?setelah koma yang cocok dengan nol atau satu koma.

Edit 2:

Ternyata hasil edit 1 adalah kesalahan. Diperbaiki. Sekarang harus ada setidaknya satu koma atau satu spasi agar ekspresi menemukan kecocokan.

KaptajnKold
sumber
Nop. Itu tidak baik. Ini adalah hasilnya: ["my", "tags are", "in here"]
gabitzish
tampaknya terbelah pada setiap karakter.
Marco
@Sukasukaa_sukaa Mungkin harus mengujinya sebelum saya melakukan pengeditan terakhir itu. Saya punya sekarang, dan kali ini seharusnya berhasil.
KaptajnKold
Hmm, bagaimana ini lebih baik daripada jawaban yang diterima? "foo,bar,foobar".split(/[ ,]+/)kembali ["foo", "bar", "foobar"]juga.
Rafał Cieślak
1
@KaptajnKold Oh, saya tidak mengerti, terima kasih telah menjawab!
Rafał Cieślak
2

Ketika saya ingin mempertimbangkan karakter tambahan seperti koma Anda (dalam kasus saya setiap token dapat dimasukkan dengan tanda kutip), saya akan melakukan string.replace () untuk mengubah pembatas lain menjadi kosong dan kemudian membaginya di spasi.

grantwparks
sumber
1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö