¿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']

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.


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);

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" 

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"]

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.


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.


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.