¿Cómo puedo dividir una cadena de JavaScript por espacio en blanco o coma?

123

Si lo intento

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

Obtengo lo siguiente

[ 'my, tags are, in here' ]

Mientras que yo quiero

['my', 'tags', 'are', 'in', 'here']
Hoa
fuente
4
¿no te refieres a espacios en blanco o comas?
KaptajnKold
1
Como explicación del resultado que está obteniendo: "my, tags are, in here".split(" ,")dividirá la cadena solo donde un espacio seguido de una coma es el separador. Su cadena no contiene esa secuencia, por lo tanto, no está dividida. "my, tags are, in here".split(", ")con la secuencia de división intercambiada, al menos dividirá su cadena original en tres partes, después de cada coma y espacio. Si desea cinco partes, las respuestas a continuación especifican la cadena de coincidencia como una expresión regular que coincide con un espacio o una coma.
Jochem Schulenklopper

Respuestas:

233

String.split también puede aceptar una expresión regular:

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

Esta expresión regular en particular se divide en una secuencia de una o más comas o espacios, de modo que, por ejemplo, múltiples espacios consecutivos o una secuencia de coma + espacio no producen elementos vacíos en los resultados.

Jon
fuente
22
¿Qué hay de /,?\s+/?
Bergi
4
@Bergi: Bueno, es más estricto de lo que sugiero (solo se permite una coma, al frente) y más suelto (dividido en todos los espacios en blanco) de lo que pidió el OP. En mi humilde opinión, sería simplemente peor, considere la entrada spaces , before commas.
Jon
@Jon: De acuerdo, eso depende de las necesidades de los OP. No lo haría plenk :-)
Bergi
11
+1 Sé que esto es un poco antiguo, pero ¿por qué usar un espacio en blanco y no \s? Es posible que tenga algunos saltos de línea en el blob y también me \socupe de ellos.
iambriansreed
6
NOTA FACEPALM: no ponga comillas alrededor de la expresión regular. por ejemplo, no lo use input.split("/[ ,]+/)". Deje las citas fuera (en input.split(//)lugar de input.split("//")) y tendrá una experiencia mucho mejor. Porque, curiosamente, eso probablemente solo funcionaría en sí mismo (para generar ["input.split(\"", ")\""]).
cod3monk3y
41

La sugerencia de uso .split(/[ ,]+/)es buena, pero con oraciones naturales tarde o temprano terminarás obteniendo elementos vacíos en la matriz. ej ['foo', '', 'bar'].

Lo cual está bien si está bien para su caso de uso. Pero si desea deshacerse de los elementos vacíos, puede hacer:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);
jonschlinkert
fuente
6
Ese es un uso muy inteligente de los constructores implícitos de objetos nativos, el teclado de mi computadora está loco esta mañana, editaré este comentario más tarde, pero el punto es invocar booleano como 'Boolean ()' construirá una nueva instancia de [object Boolean] con un valor de falso, al igual que invocar 'new Boolean ()'. Eso filtrará todas las coincidencias con este comportamiento predeterminado. Bonito :)
VLostBoy
¿Qué quieres decir exactamente con "oraciones naturales"? No pude emularlo ni entiendo lo que se supone que debe hacer.
cregox
Lo explica @VLostBoy. Cuando se invoca al Boolean()constructor sobre cualquier valor, lo convierte en un valor booleano: verdadero o falso. Por lo tanto, los valores falsos se filtrarán de la matriz, incluidas las cadenas vacías.
jonschlinkert
1
por cierto, puede usar constructores implícitos para otras cosas divertidas similares, como[1, 2, 3].map(String)
jonschlinkert
2
"foo, bar,,foobar,".split(/[\s,]+/)devuelve ["foo", "bar", "foobar", ""](debido a la coma que cuelga al final), ¡gracias!
Rafał Cieślak
37

puede usar expresiones regulares para capturar cualquier longitud de espacio en blanco, y esto sería así:

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
fuente
Tenga cuidado con los espacios en blanco iniciales / finales al usar /\s+/. Por ejemplo 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ],. Si .trim()primero le das la cuerda, estarás bien.
Jordan Dodson
12
"my, tags are, in here".split(/[ ,]+/)

el resultado es :

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

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

\s*Coincide con cero o más caracteres de espacio en blanco (no solo espacios, sino también tabulaciones y nuevas líneas).

... [\s,]coincide con un carácter de espacio en blanco o una coma

Si desea evitar elementos en blanco de entrada como "foo,bar,,foobar", esto hará el truco:

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

El +coincida con uno o más de los caracteres o grupo precedente.

Editar:

Agregado ?después de la coma que coincide con cero o una coma.

Edición 2:

Resulta que la edición 1 fue un error. Arreglado. Ahora tiene que haber al menos una coma o un espacio para que la expresión encuentre una coincidencia.

KaptajnKold
fuente
Nop. Eso no es bueno. Este es el resultado: ["mi", "etiquetas son", "aquí"]
gabitzish
parece dividirse en cada personaje.
Marco
@Marco Vaya. Probablemente debería haberlo probado antes de hacer la última edición. Ahora tengo, y esta vez realmente debería funcionar.
KaptajnKold
Hmm, ¿cómo es esto mejor que la respuesta aceptada? "foo,bar,foobar".split(/[ ,]+/)devuelve ["foo", "bar", "foobar"]también.
Rafał Cieślak
1
@KaptajnKold Oh, no entendí eso, ¡gracias por responder!
Rafał Cieślak
2

Cuando quiero tener en cuenta caracteres adicionales como sus comas (en mi caso, cada token se puede ingresar con comillas), hago un string.replace () para cambiar los otros delimitadores a espacios en blanco y luego dividirlos en espacios en blanco.

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