C'è una differenza tra / \ s / ge / \ s + / g?


89

Quando abbiamo una stringa che contiene caratteri spazio:

var str = '  A B  C   D EF ';

e vogliamo rimuovere gli spazi dalla stringa (vogliamo questo :) 'ABCDEF'.

Entrambi questo:

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

e questo:

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

restituirà il risultato corretto.

Ciò significa che +è superfluo in questa situazione? C'è una differenza tra queste due espressioni regolari in questa situazione (come in, potrebbero in qualche modo produrre risultati diversi)?


Aggiornamento: confronto delle prestazioni - /\s+/gè più veloce. Vedi qui: http://jsperf.com/s-vs-s


1
vidas stackoverflow.com/questions/5963182/… Scommetto che questo è ciò che ti ha fatto fare questa domanda;) (il tuo commento sulla risposta)
rsplak

2
Posso immaginare che \s+sia più veloce, perché può sostituire blocchi di spazi bianchi, mentre \sdeve sostituire ogni spazio bianco separatamente?
KooiInc

1
@KooiInc: corretto, perché corrisponde / sostituisce meno volte.
BoltClock

Risposte:


219

Nella prima regex, ogni carattere spazio viene sostituito, carattere per carattere, con la stringa vuota.

Nella seconda regex, ogni stringa contigua di caratteri spazio viene sostituita con la stringa vuota a causa di+ .

Tuttavia, proprio come 0 moltiplicato per qualsiasi altra cosa è 0, sembra che entrambi i metodi eliminino gli spazi esattamente allo stesso modo.

Se cambi la stringa di sostituzione in '#', la differenza diventa molto più chiara:

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#

28

\ssignifica "uno spazio" e \s+significa "uno o più spazi".

Ma, poiché stai usando il /gflag (sostituisci tutte le occorrenze) e sostituisci con la stringa vuota, le tue due espressioni hanno lo stesso effetto.


Ma la seconda versione sarà probabilmente più veloce.
Tim Pietzcker

significa che non ho bisogno di usare / g se sto usando \ s +
Gaurav

1
@ Gaurav: No. Perché in tal caso sostituirebbe solo il primo \s+, lasciando intatto il resto. Ad esempio, ' foo bar '.replace(/\s+/, '')ti darebbe solo 'foo bar ' modificare argh HTML condensando due spazi in uno
BoltClock

@ Gaurav Non credo proprio. Se ometti il gmodificatore, verrà sostituita solo la prima occorrenza di un blocco di spazi bianchi.
KooiInc

10

In una situazione di corrispondenza, il primo restituirebbe una corrispondenza per spazio bianco, mentre il secondo restituirebbe una corrispondenza per ogni gruppo di spazi bianchi.

Il risultato è lo stesso perché lo stai sostituendo con una stringa vuota. Se lo sostituisci con "x", ad esempio, i risultati saranno diversi.

str.replace(/\s/g, '') restituirà "xxAxBxxCxxxDxEF"

mentre str.replace(/\s+/g, '') restituirà 'xAxBxCxDxEF'

perché \scorrisponde a ogni spazio bianco, sostituendo ciascuno di essi con "x", e \s+corrisponde a gruppi di spazi, sostituendo più spazi bianchi sequenziali con una singola "x".


3

+significa "uno o più caratteri" e senza il segno più significa "un carattere". Nel tuo caso entrambi danno lo stesso risultato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.