Bir JavaScript dizesini beyaz boşluk veya virgülle nasıl bölebilirim?


123

Denersem

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

Aşağıdakileri alıyorum

[ 'my, tags are, in here' ]

Halbuki ben istiyorum

['my', 'tags', 'are', 'in', 'here']

4
boşluk veya virgül demek istemedin mi?
KaptajnKold

1
Elde ettiğiniz sonucun bir açıklaması olarak: "my, tags are, in here".split(" ,")dizeyi yalnızca ayırıcı bir boşluk ve ardından virgül olduğu durumlarda böler . Diziniz bu diziyi içermez, dolayısıyla bölünmez. "my, tags are, in here".split(", ")bölme dizisi takas edildiğinde, orijinal dizenizi her virgül ve boşluktan sonra en azından üç parçaya böler. Beş parça istiyorsanız, aşağıdaki yanıtlar eşleşme dizesini boşluk veya virgülle eşleşen normal ifade olarak belirtir .
Jochem Schulenklopper

Yanıtlar:


233

String.split bir normal ifadeyi de kabul edebilir:

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

Bu belirli normal ifade, bir veya daha fazla virgül veya boşluk dizisine bölünür, böylece örneğin birden çok ardışık boşluk veya bir virgül + boşluk dizisi sonuçlarda boş öğeler üretmez.


22
Peki ya /,?\s+/?
Bergi

4
@Bergi: Hem önerdiğimden daha katı (önde sadece bir virgül izin verilir) hem de OP'nin istediğinden daha gevşek (tüm boşluklarda bölünmüş). IMHO basitçe daha kötü olurdu - girdiyi düşünün spaces , before commas.
Jon

@Jon: Tamam, bu OP'lerin ihtiyaçlarına bağlı. Ben plenk :-)
Bergi

11
+1 Bunun biraz eski olduğunu biliyorum ama neden boşluk kullanıp kullanmayalım \s. Blob'da bazı satır sonları olabilir ve \sbunlarla da ilgilenirim.
iambriansreed

6
FACEPALM NOT: Normal ifadeyi tırnak içine almayın. örneğin kullanmayın input.split("/[ ,]+/)". Alıntıları dışarıda bırakın ( input.split(//)yerine input.split("//")) ve çok daha iyi bir deneyim yaşayacaksınız. Çünkü tuhaf bir şekilde, bu gerçekten muhtemelen sadece kendi üzerinde çalışacaktır (üretmek için ["input.split(\"", ")\""]).
cod3monk3y

41

Kullanım önerisi .split(/[ ,]+/)iyidir, ancak doğal cümlelerle er ya da geç dizide boş öğeler elde edersiniz. Örneğin['foo', '', 'bar'] .

Sizin kullanım durumunuz için uygunsa sorun değil. Ancak boş unsurlardan kurtulmak istiyorsanız şunları yapabilirsiniz:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);

6
Bu, yerel nesne örtük oluşturucularının çok akıllıca kullanımı - bilgisayarımın klavyesi bu sabah çılgınca - bu yorumu daha sonra düzenleyeceğim - ancak nokta, Boolean'ı çağırıyor, 'Boolean ()' gibi yeni bir [object Boolean] örneği oluşturacak false değeri, tıpkı 'new Boolean ()' çağrılacağı gibi. Bu, tüm eşleşmeleri bu varsayılan davranışa göre filtreleyecektir. Güzel bir :)
VLostBoy

"doğal cümleler" ile tam olarak neyi kastediyorsunuz? Onu taklit edemedim ve bunun ne yapması gerektiğini anlamıyorum.
cregox

@VLostBoy tarafından açıklanmıştır. Ne zaman Boolean()doğru veya yanlış - yapıcı herhangi bir değeri denir, bu boolean bu değeri düşürdü. Böylece, boş dizeler de dahil olmak üzere tüm yanlış değerler diziden filtrelenecektir.
jonschlinkert

1
btw, diğer benzer eğlenceli şeyler için örtük oluşturucular kullanabilirsiniz, örneğin[1, 2, 3].map(String)
jonschlinkert

2
"foo, bar,,foobar,".split(/[\s,]+/)döner ["foo", "bar", "foobar", ""](sonunda sarkan virgül nedeniyle), teşekkürler!
Rafał Cieślak

37

herhangi bir uzunluktaki beyaz boşluğu yakalamak için normal ifadeyi kullanabilirsiniz ve bu şöyle olur:

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" 

Kullanırken baştaki / sondaki boşluklara dikkat edin /\s+/. Örneğin 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ],. .trim()İlk önce dizeyi seçersen , iyi olacaksın.
Jordan Dodson

12
"my, tags are, in here".split(/[ ,]+/)

sonuç:

["my", "tags", "are", "in", "here"]

4

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

\s*Sıfır veya daha fazla beyaz boşluk karakteriyle eşleşir (yalnızca boşluklarla değil, aynı zamanda sekmelerle ve satırsonlarıyla).

... [\s,]bir beyaz boşluk karakteriyle veya bir virgülle eşleşir

Giriş gibi boş öğelerden kaçınmak istiyorsanız "foo,bar,,foobar", bu hile yapacak:

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

+Bir veya önceki karakter veya grubun daha eşleşir.

Düzenle:

Eklenen ?sıfır veya bir virgül ile eşleşen virgülden sonra.

Düzenleme 2:

Düzenleme 1'in bir hata olduğu ortaya çıktı. Onu düzeltti. Şimdi ifadenin bir eşleşme bulması için en az bir virgül veya bir boşluk olması gerekir.


Nop. Bu iyi değil. Çıktı şudur: ["benim", "etiketler", "burada"]
gabitzish

her karaktere göre bölünmüş görünüyor.
Marco

@Marco Oops. Muhtemelen o son düzenlemeyi yapmadan önce test etmeliydim. Şimdi sahibim ve bu sefer gerçekten çalışmalı.
KaptajnKold

Hmm, bu kabul edilen cevaptan nasıl daha iyi? aynı zamanda "foo,bar,foobar".split(/[ ,]+/)geri döner ["foo", "bar", "foobar"].
Rafał Cieślak

1
@KaptajnKold Oh, anlayamadım, cevap verdiğin için teşekkürler!
Rafał Cieślak

2

Virgülleriniz gibi fazladan karakterleri hesaba katmak istediğimde (benim durumumda her bir belirteç tırnak işaretleriyle girilebilir), diğer sınırlayıcıları boşluk olarak değiştirmek ve ardından boşluklara ayırmak için bir string.replace () yapıyorum.


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.