Come posso dividere una stringa JavaScript con uno spazio bianco o una virgola?


123

Se ci provo

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

Ottengo quanto segue

[ 'my, tags are, in here' ]

Mentre io voglio

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

4
non intendi spazi bianchi o virgole?
KaptajnKold,

1
Come spiegazione del risultato che stai ottenendo: "my, tags are, in here".split(" ,")dividerà la stringa solo dove uno spazio seguito da una virgola è il separatore. La tua stringa non contiene quella sequenza, quindi non è divisa. "my, tags are, in here".split(", ")con la sequenza di divisione scambiata, dividerà almeno la stringa originale in tre parti, dopo ogni virgola e spazio. Se desideri cinque parti, le risposte seguenti specificano la stringa di corrispondenza come un'espressione regolare che corrisponde a uno spazio o una virgola.
Jochem Schulenklopper

Risposte:


233

String.split può anche accettare un'espressione regolare:

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

Questa particolare espressione regolare si divide su una sequenza di una o più virgole o spazi, in modo che, ad esempio, più spazi consecutivi o una sequenza virgola + spazio non producano elementi vuoti nei risultati.


22
Di cosa /,?\s+/?
Bergi

4
@Bergi: Beh, è ​​sia più rigoroso di quello che suggerisco (è consentita solo una virgola, davanti) che più ampio (diviso su tutti gli spazi bianchi) di quanto richiesto dall'OP. IMHO sarebbe semplicemente peggio: considera l'input spaces , before commas.
Jon,

@ Jon: OK, dipende dalle esigenze dei PO. Non vorrei plenk :-)
Bergi

11
+1 So che questo è un po 'vecchio, ma perché usare uno spazio vuoto e non \s. Potrei avere alcune interruzioni di riga nel blob e mi \soccupo anche di quelle.
iambriansreed

6
NOTA FACEPALM: non inserire virgolette attorno alla regex. ad esempio, non utilizzare input.split("/[ ,]+/)". Lascia fuori le virgolette ( input.split(//)invece di input.split("//")) e avrai un'esperienza molto migliore. Perché stranamente, questo probabilmente funzionerebbe solo su se stesso (per generare ["input.split(\"", ")\""]).
cod3monk3y

41

Il suggerimento da usare .split(/[ ,]+/)è buono, ma con frasi naturali prima o poi finirai per ottenere elementi vuoti nell'array. es ['foo', '', 'bar'].

Il che va bene se va bene per il tuo caso d'uso. Ma se vuoi sbarazzarti degli elementi vuoti puoi fare:

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

6
Questo è un uso molto intelligente dei costruttori impliciti di oggetti nativi- la tastiera del mio computer è pazza questa mattina- Modificherò questo commento più tardi- ma il punto è invocare Boolean come 'Boolean ()' costruirà una nuova istanza di [object Boolean] con un valore di false, proprio come invocare 'new Boolean ()'. Ciò filtrerà tutte le corrispondenze fino a questo comportamento predefinito. Bella :)
VLostBoy

cosa intendi esattamente per "frasi naturali"? Non potrei emularlo né capisco cosa dovrebbe fare.
cregox

È spiegato da @VLostBoy. Quando il Boolean()costruttore viene chiamato su qualsiasi valore, esegue il cast di quel valore su un valore booleano: vero o falso. Pertanto, eventuali valori falsi verranno filtrati dall'array, comprese le stringhe vuote.
jonschlinkert

1
a proposito, puoi usare costruttori impliciti per altre cose divertenti simili, come[1, 2, 3].map(String)
jonschlinkert

2
"foo, bar,,foobar,".split(/[\s,]+/)ritorna ["foo", "bar", "foobar", ""](a causa della virgola penzoloni alla fine), grazie!
Rafał Cieślak

37

puoi usare regex per catturare qualsiasi lunghezza di spazio bianco, e questo sarebbe come:

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" 

Prestare attenzione agli spazi bianchi iniziali / finali durante l'utilizzo /\s+/. Ad esempio 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ],. Se sei .trim()il primo a stringere, starai bene.
Jordan Dodson

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

il risultato è:

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

4

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

... \s*corrisponde a zero o più caratteri di spazio bianco (non solo spazi, ma anche tabulazioni e nuove righe).

... [\s,]corrisponde a uno spazio vuoto oa una virgola

Se vuoi evitare elementi vuoti dall'input come "foo,bar,,foobar", questo farà il trucco:

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

L' +corrisponde uno o più del carattere precedente o di gruppo.

Modificare:

Aggiunto ?dopo la virgola che corrisponde a zero o una virgola.

Modifica 2:

Risulta che la modifica 1 è stata un errore. Aggiustato. Ora deve esserci almeno una virgola o uno spazio affinché l'espressione trovi una corrispondenza.


Nop. Questo non è buono. Questo è l'output: ["my", "tags are", "in here"]
gabitzish

sembra dividere su ogni personaggio.
Marco

@Marco Oops. Probabilmente avrei dovuto provarlo prima di apportare l'ultima modifica. Adesso sì, e questa volta dovrebbe funzionare davvero.
KaptajnKold

Hmm, come è meglio della risposta accettata? "foo,bar,foobar".split(/[ ,]+/)ritorna ["foo", "bar", "foobar"]pure.
Rafał Cieślak

1
@KaptajnKold Oh, non l'ho capito, grazie per aver risposto!
Rafał Cieślak

2

Quando voglio prendere in considerazione caratteri extra come le virgole (nel mio caso ogni token può essere inserito tra virgolette), farei una stringa.replace () per cambiare gli altri delimitatori in spazi e poi dividerli su spazi bianchi.


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.