2012-04-27 22 views
80

Ben çalışırsanızBir JavaScript dizesini beyaz boşluk veya virgülle nasıl bölebilirim?

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

alıyorum istediğim Oysa

[ 'my, tags are, in here' ] 

aşağıdaki

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

don' beyaz boşluk * veya * virgül mü demek istiyorsun? – KaptajnKold

+1

Aldığınız sonuç için bir açıklama olarak: "" benim, etiketler burada, burada. ".split (", ")' dizgiyi yalnızca bir virgülle ayrılmış bir _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _. Dizginiz bu diziyi içermiyor, dolayısıyla bölünmüyor. '" Etiketlerim burada, ".split (", ")' ile değiştirilen bölme sırası, her bir virgül ve boşluktan sonra en az üç parça halinde orijinal dizginizi böler. Beş parça istiyorsanız, aşağıdaki yanıtlar, eşleme dizesini _or_ virgülle eşleşen normal bir ifade olarak belirtir. –

cevap

160

String.split da normal bir ifade kabul edebilir:

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

Bu özel regex, bir veya daha fazla virgül veya boşluk dizisi üzerinde bölünür, böylece örn. Birden fazla ardışık boşluk veya bir virgül + boşluk dizisi sonuçlarda boş eleman üretmez.

+16

Peki ya, '/,? \ S +/'? – Bergi

+1

Bu da işe yarıyor. – gabitzish

+4

@Bergi: Eh, her ikisi de önerdiğimden daha sıkı (ön tarafta sadece bir virgül) ve OP'nin istediğinden daha gevşek (tüm boşluklara bölünmüş). IMHO basitçe daha kötü olurdu - 'virgüllerden önce' boşlukları dikkate alın. – Jon

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

sonucudur:

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

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

... \s* maçlar sıfır veya daha fazla boşluk karakterleri (sadece boşluk değil, aynı zamanda sekmeleri ve satırbaşları).

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

+ maçları:

... [\s,] Eğer "foo,bar,,foobar" gibi girişten boş unsurları önlemek istiyorsanız, bu hile olacaktır

bir boşluk karakteri veya bir virgül maçları önceki karakter veya gruptan bir veya daha fazlası.

Düzenleme: sıfır veya bir virgül ile eşleşen virgülden sonra

Eklendi ?.

Düzenleme 2:

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

+0

Nop. Bu iyi değil. Bu çıktı: ["benim", "etiketler", "burada"] – gabitzish

+0

Şimdi düzeltilmelidir. – KaptajnKold

+0

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

1

I (benim durumumda her belirteç tırnak girilebilir), ben boşlukları için diğer ayraçları değiştirmek için bir String.Replace() yapmak ve sonra bölünmüş yazıyı, virgül gibi hesap ekstra karakterler içine almak istediğinizde Beyaz boşluk.

28

.split(/[ ,]+/) kullanım önerisi iyidir, ancak doğal cümleler er ya da geç dizide boş öğeleri almanıza neden olur. Örneğin. ['foo', '', 'bar'].

Kullanım durumunuz için sorun olmazsa sorun olur. Eğer boş elemanların kurtulmak istiyorsanız yapabileceğiniz:

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

Native object implicit constructors'ın çok akıllıca kullanımı bu benim bilgisayar klavyem bu sabah çılgınca - bu yorumu daha sonra düzenleyeceğim- fakat Boolean'ın 'Boolean()' gibi yeni bir örneğini [Boolean] nesnesiyle yeni bir nesne oluşturacaktır Yeni Boole() 'yi çağıracak gibi, yanlış bir değer. Bu, tüm eşleşmeleri bu varsayılan davranışa göre filtreleyecektir. Güzel bir :) – VLostBoy

+0

teşekkürler! Ben "doğal cümleler" ile tam olarak ne demek istiyorsun süper yararlı bir hile – jonschlinkert

+0

olarak buldum? Bunu taklit edemedim, bunun ne yapması gerektiğini anlamıyorum. – cregox

11

beyaz alanları herhangi uzunluğunu yakalamak için normal ifadeler kullanabilirsiniz ve bu olacak gibi:

 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" 
İlgili konular