Como posso dividir uma string JavaScript por espaço em branco ou vírgula?

123

Se eu tentar

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

Eu entendo o seguinte

[ 'my, tags are, in here' ]

Considerando que eu quero

['my', 'tags', 'are', 'in', 'here']
Hoa
fonte
4
não quer dizer espaço em branco ou vírgula?
KaptajnKold
1
Como uma explicação para o resultado que você está obtendo: "my, tags are, in here".split(" ,")irá dividir a string apenas onde um espaço seguido por uma vírgula for o separador. Sua string não contém essa sequência, portanto, não é dividida. "my, tags are, in here".split(", ")com a sequência de divisão trocada, irá pelo menos dividir sua string original em três partes, após cada vírgula e espaço. Se você quiser cinco partes, as respostas abaixo especificam a string de correspondência como uma expressão regular correspondendo a um espaço ou vírgula.
Jochem Schulenklopper de

Respostas:

233

String.split também pode aceitar uma expressão regular:

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

Esta regex particular se divide em uma sequência de uma ou mais vírgulas ou espaços, de modo que, por exemplo, vários espaços consecutivos ou uma sequência de vírgula + espaço não produzam elementos vazios nos resultados.

Jon
fonte
22
Sobre o quê /,?\s+/?
Bergi
4
@Bergi: Bem, é mais rígido do que o que eu sugiro (apenas uma vírgula é permitida, na frente) e mais solto (dividido em todos os espaços em branco) do que o OP pediu. IMHO seria simplesmente pior - considere a entrada spaces , before commas.
Jon
@Jon: OK, isso depende das necessidades dos OPs. Eu não completaria :-)
Bergi
11
1 Eu sei que isso é um pouco antigo, mas por que usar um espaço em branco e não \s. Posso ter algumas quebras de linha no blob e \scuido delas também.
iambriansreed
6
FACEPALM NOTA: não coloque aspas ao redor da regex. por exemplo, não use input.split("/[ ,]+/)". Deixe as aspas (em input.split(//)vez de input.split("//")) e você terá uma experiência muito melhor. Porque, estranhamente, isso provavelmente só funcionaria em si mesmo (para gerar ["input.split(\"", ")\""]).
cod3monk3y
41

A sugestão de uso .split(/[ ,]+/)é boa, mas com frases naturais, mais cedo ou mais tarde, você acabará obtendo elementos vazios no array. por exemplo['foo', '', 'bar'] .

O que é bom se estiver bom para o seu caso de uso. Mas se você quiser se livrar dos elementos vazios, pode fazer:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);
jonschlinkert
fonte
6
Esse é um uso muito inteligente de construtores implícitos de objetos nativos - o teclado do meu computador está louco esta manhã - vou editar este comentário mais tarde - mas o ponto é invocar Boolean como 'Boolean ()' irá construir uma nova instância de [object Boolean] com um valor de false, da mesma forma que invocar 'new Boolean ()'. Isso filtrará todas as correspondências até esse comportamento padrão. Boa :)
VLostBoy
o que exatamente você quer dizer com "frases naturais"? Eu não consegui emular nem entendo o que isso deveria fazer.
cregox de
É explicado por @VLostBoy. Quando o Boolean()construtor é chamado em qualquer valor, ele converte esse valor em um booleano - verdadeiro ou falso. Portanto, quaisquer valores falsos serão filtrados do array, incluindo strings vazias.
jonschlinkert
1
btw, você pode usar construtores implícitos para outras coisas divertidas semelhantes, como[1, 2, 3].map(String)
jonschlinkert
2
"foo, bar,,foobar,".split(/[\s,]+/)retorna ["foo", "bar", "foobar", ""](por causa da vírgula pendente no final), obrigado!
Rafał Cieślak
37

você pode usar regex para capturar qualquer comprimento de espaço em branco, e isso seria assim:

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
fonte
Cuidado com os espaços em branco à esquerda / à direita ao usar /\s+/. Por exemplo 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ],. Se você .trim()colocar a corda primeiro, você será bom.
Jordan Dodson
12
"my, tags are, in here".split(/[ ,]+/)

o resultado é :

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

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

\s* Corresponde a zero ou mais caracteres de espaço em branco (não apenas espaços, mas também tabulações e novas linhas).

... [\s,] corresponde a um caractere de espaço em branco ou uma vírgula

Se você quiser evitar elementos em branco de entrada como "foo,bar,,foobar", isso fará o truque:

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

o + corresponde a um ou mais dos caracteres ou grupos anteriores.

Editar:

Adicionado ?após a vírgula que corresponde a zero ou uma vírgula.

Editar 2:

Acontece que a edição 1 foi um erro. Corrigido. Agora deve haver pelo menos uma vírgula ou um espaço para que a expressão encontre uma correspondência.

KaptajnKold
fonte
Não. Isso não é bom. Esta é a saída: ["meu", "tags são", "aqui"]
gabitzish
parece se dividir em cada personagem.
Marco
@Marco Oops. Provavelmente deveria ter testado antes de fazer a última edição. Eu tenho agora, e desta vez realmente deve funcionar.
KaptajnKold
Hmm, como isso é melhor do que a resposta aceita? "foo,bar,foobar".split(/[ ,]+/)retorna ["foo", "bar", "foobar"]também.
Rafał Cieślak
1
@KaptajnKold Oh, não entendi, obrigado por responder!
Rafał Cieślak
2

Quando eu quiser levar em consideração caracteres extras como suas vírgulas (no meu caso, cada token pode ser inserido com aspas), eu faria um string.replace () para alterar os outros delimitadores para espaços em branco e depois dividir em espaços em branco.

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