2010-08-23 17 views
5

Estoy tratando de dividir una cadena en una matriz de palabras, sin embargo, quiero mantener los espacios después de cada palabra. Esto es lo que estoy tratando:División de cadenas en una matriz de palabras usando expresiones regulares

var re = /[a-z]+[$\s+]/gi; 
var test = "test one two  three four "; 
var results = test.match(re); 

Los resultados que cabe esperar son:

[0]: "test " 
[1]: "one " 
[2]: "two  " 
[3]: "three " 
[4]: "four " 

Sin embargo, sólo coincide con un máximo de un espacio después de cada palabra:

[0]: "test " 
[1]: "one " 
[2]: "two " 
[3]: "three " 
[4]: "four " 

¿Qué soy yo haciendo mal?

+0

si es necesario para mantener el espacio, ¿por qué añadir ' $ 'y' + 'en la segunda clase? – dierre

Respuesta

7

considerar:

var results = test.match(/\S+\s*/g); 

que garantice que no se pierda ningún carácter (además de unos espacios en los comienzos, pero \S*\s* puede hacerse cargo de eso)

Su expresión regular original dice:

  • [a-z]+ - encontró ningún número de letras (al menos uno)
  • [$\s+] - mucho un solo carácter - $, + o espacio en blanco. Sin un cuantificador después de este grupo, solo coincide con un solo espacio.
2

intente lo siguiente:

test.match(/\w+\s+/g); // \w = words, \s = white spaces 
+1

O si el último bit de espacio en blanco es opcional: 'test.match (/ \ w + \ s */gi)' – Wolph

+0

@Wolph: ¿por qué el indicador de mayúsculas y minúsculas? –

+0

Esto dividirá "Estoy codificando" en "I", "m" y "codificación". –

1

está usando el + dentro de la clase Char. Intente usar * fuera de la clase char en su lugar.

/[a-z]+\s*/gi; 

+ dentro de la clase carbón es tratado como un literal + y no como un char meta. El uso de * capturará cero o más espacios que pueden seguir cualquier palabra.

0

El + se toma literalmente dentro de la clase de caracteres. Tienes que moverlo afuera: [\s]+ o simplemente \s+ ($ no tiene ningún significado dentro de la clase tampoco).

0

La parte esencial de su RegEx que necesita cambiar es la parte que coincide con el espacio en blanco o el final de línea.

Probar:

var re = /[a-z]+($|\s+)/gi 

o, por non-capturing groups (no sé si necesita esto con la bandera /g):

var re = /[a-z]+(?:$|\s+)/gi 
Cuestiones relacionadas