2011-05-11 32 views
53

Cuando tenemos una cadena que contiene los caracteres de espacio:¿Hay alguna diferencia entre/ s/g y/ s +/g?

var str = ' A B C D EF '; 

y queremos quitar los espacios de la cadena (queremos esto: 'ABCDEF').

Tanto este:

str.replace(/\s/g, '') 

y esto:

str.replace(/\s+/g, '') 

devolverá el resultado correcto.

¿Esto significa que el + es superfluo en esta situación? ¿Hay alguna diferencia entre esas dos expresiones regulares en esta situación (como en, podrían de alguna manera producir resultados diferentes)?


Actualización: Comparación de rendimiento - /\s+/g es más rápido. Vea aquí: http://jsperf.com/s-vs-s

+1

vidas http://stackoverflow.com/questions/5963182/how-to-remove-spaces-from-a- string-using-javascript/5963256 Apuesto a que esto es lo que hizo que hicieras esta pregunta;) (tu comentario sobre la respuesta) – rsplak

+0

Me imagino que '\ s +' es más rápido, porque puede reemplazar fragmentos de espacios en blanco, mientras que '\ s' debe reemplazar cada espacio en blanco por separado? – KooiInc

+0

@KooiInc: Correcto, porque coincide/reemplaza menos veces. – BoltClock

Respuesta

150

En la primera expresión regular, se está reemplazando cada carácter de espacio, carácter por carácter, con la cadena vacía.

En la segunda expresión regular, cada cadena contigua de caracteres de espacio se está reemplazando con la cadena vacía debido a +.

Sin embargo, así como 0 multiplicado por cualquier otra cosa es 0, parece que ambos métodos eliminan los espacios exactamente de la misma manera.

Si cambia la cadena para '#', la diferencia se vuelve mucho más claro:

var str = ' A B C D EF '; 
console.log(str.replace(/\s/g, '#')); // ##A#B##C###D#EF# 
console.log(str.replace(/\s+/g, '#')); // #A#B#C#D#EF# 
15

\s significa "un espacio", y \s+ significa "uno o más espacios".

Pero, como está utilizando el indicador /g (reemplace todas las apariciones) y reemplazando con la cadena vacía, sus dos expresiones tienen el mismo efecto.

+0

Pero la segunda versión probablemente sea más rápida. –

+0

significa, no necesito usar/g si estoy usando \ s + – Gaurav

+1

@Gaurav: No. Porque reemplazaría solamente los primeros '\ s +', dejando el resto intacto. Por ejemplo, ''foo bar' .replace (/ \ s + /, '')' te daría solo ''foo bar'' * edit argh HTML condensando dos espacios en uno * – BoltClock

7

En una situación de coincidencia, la primera devolvería una coincidencia por espacio en blanco, cuando la segunda devolvería una coincidencia para cada grupo de espacios en blanco.

El resultado es el mismo porque lo está reemplazando con una cadena vacía. Si lo reemplaza con 'x' por ejemplo, los resultados serían diferentes.

str.replace(/\s/g, '') volverá 'xxAxBxxCxxxDxEF'

mientras str.replace(/\s+/g, '') devolverá 'xAxBxCxDxEF'

PORQUE \s partidos cada espacio en blanco, sustituyendo cada uno con 'x', y \s+ coincidencias grupos de espacios en blanco, en sustitución de varios espacios en blanco secuenciales con una sola 'x'.

2

+ significa "uno o más caracteres" y sin el signo más significa "un carácter". En su caso, ambos dan como resultado el mismo resultado.

Cuestiones relacionadas