Y a-t-il une différence entre / \ s / g et / \ s + / g?

87

Lorsque nous avons une chaîne qui contient des caractères d'espace:

var str = '  A B  C   D EF ';

et nous voulons supprimer les espaces de la chaîne (nous voulons ceci:) 'ABCDEF'.

À la fois ceci:

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

et ça:

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

renverra le résultat correct.

Cela signifie-t-il que le +est superflu dans cette situation? Y a-t-il une différence entre ces deux expressions régulières dans cette situation (comme dans, pourraient-elles d'une manière ou d'une autre produire des résultats différents)?


Mise à jour: comparaison des performances - /\s+/gest plus rapide. Voir ici: http://jsperf.com/s-vs-s

Šime Vidas
la source
1
vidas stackoverflow.com/questions/5963182/… Je parie que c'est ce qui vous a fait poser cette question;) (votre commentaire sur la réponse)
rsplak
2
Je peux imaginer que \s+c'est plus rapide, car il peut remplacer des morceaux d'espaces blancs, alors qu'il \sfaut remplacer chaque espace blanc séparément?
KooiInc
1
@KooiInc: Correct, car il correspond / remplace moins de fois.
BoltClock

Réponses:

214

Dans la première expression régulière, chaque caractère d'espace est remplacé, caractère par caractère, par la chaîne vide.

Dans la deuxième regex, chaque chaîne contiguë de caractères d'espace est remplacée par la chaîne vide en raison de l'extension +.

Cependant, tout comme la façon dont 0 multiplié par autre chose est 0, il semble que les deux méthodes suppriment les espaces exactement de la même manière.

Si vous remplacez la chaîne de remplacement par '#', la différence devient beaucoup plus claire:

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#
BoltClock
la source
27

\ssignifie «un espace» et \s+signifie «un ou plusieurs espaces».

Mais, comme vous utilisez l' /gindicateur (remplacez toutes les occurrences) et que vous remplacez par la chaîne vide, vos deux expressions ont le même effet.

Courses de légèreté en orbite
la source
Mais la deuxième version sera probablement plus rapide.
Tim Pietzcker
cela signifie-t-il que je n'ai pas besoin d'utiliser / g si j'utilise \ s +
Gaurav
1
@Gaurav: Non. Parce qu'alors il ne remplacerait que le premier \s+, laissant le reste intact. Par exemple, ' foo bar '.replace(/\s+/, '')vous donnerait seulement 'foo bar ' modifier argh HTML en condensant deux espaces en un seul
BoltClock
@Gaurav je ne pense pas. Si vous omettez le gmodificateur, seule la première occurrence d'un bloc d'espaces blancs sera remplacée.
KooiInc
10

Dans une situation de correspondance, le premier renverrait une correspondance par espace, tandis que le second renverrait une correspondance pour chaque groupe d'espaces.

Le résultat est le même car vous le remplacez par une chaîne vide. Si vous le remplacez par «x» par exemple, les résultats seront différents.

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

tandis que str.replace(/\s+/g, '') retournera 'xAxBxCxDxEF'

car \scorrespond à chaque espace, en remplaçant chacun par 'x', et \s+correspond à des groupes d'espaces, en remplaçant plusieurs espaces séquentiels par un seul 'x'.

Doug
la source
3

+signifie «un ou plusieurs caractères» et sans le signe plus, cela signifie «un caractère». Dans votre cas, les deux aboutissent au même résultat.

Josh M.
la source