Gibt es einen Unterschied zwischen / \ s / g und / \ s + / g?

83

Wenn wir eine Zeichenfolge haben, die Leerzeichen enthält:

var str = '  A B  C   D EF ';

und wir wollen die Leerzeichen aus der Zeichenfolge entfernen (wir wollen dies :) 'ABCDEF'.

Beides:

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

und das:

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

gibt das richtige Ergebnis zurück.

Bedeutet das, dass das +in dieser Situation überflüssig ist? Gibt es in dieser Situation einen Unterschied zwischen diesen beiden regulären Ausdrücken (wie in, könnten sie in irgendeiner Weise zu unterschiedlichen Ergebnissen führen)?


Update: Leistungsvergleich - /\s+/gist schneller. Siehe hier: http://jsperf.com/s-vs-s

Šime Vidas
quelle
1
vidas stackoverflow.com/questions/5963182/… Ich wette, das hat dich dazu gebracht, diese Frage zu stellen;) (dein Kommentar zur Antwort)
rsplak
2
Ich kann mir vorstellen \s+, dass es schneller ist, weil es Leerzeichen ersetzen kann, während \sjedes Leerzeichen separat ersetzt werden muss.
KooiInc
1
@KooiInc: Richtig, weil es weniger oft übereinstimmt / ersetzt.
BoltClock

Antworten:

210

In der ersten Regex wird jedes Leerzeichen zeichenweise durch die leere Zeichenfolge ersetzt.

In der zweiten Regex wird jede zusammenhängende Zeichenfolge von Leerzeichen aufgrund der durch die leere Zeichenfolge ersetzt +.

Genau wie 0 multipliziert mit irgendetwas anderem 0 ist, scheint es jedoch so, als würden beide Methoden Leerzeichen auf genau dieselbe Weise entfernen.

Wenn Sie die Ersatzzeichenfolge in ändern '#', wird der Unterschied viel deutlicher:

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
quelle
26

\sbedeutet "ein Leerzeichen" und \s+bedeutet "ein oder mehrere Leerzeichen".

Da Sie jedoch das /gFlag verwenden (alle Vorkommen ersetzen) und durch die leere Zeichenfolge ersetzen, haben Ihre beiden Ausdrücke den gleichen Effekt.

Leichtigkeitsrennen im Orbit
quelle
Aber die zweite Version wird wahrscheinlich schneller sein.
Tim Pietzcker
bedeutet es, ich muss / g nicht verwenden, wenn ich \ s +
Gaurav
1
@ Gaurav: Nein. Denn dann würde es nur das erste ersetzen \s+und den Rest intakt lassen. Zum Beispiel ' foo bar '.replace(/\s+/, '')würden Sie nur 'foo bar ' argh HTML bearbeiten, indem Sie zwei Leerzeichen zu einem
komprimieren
@ Gaurav Ich glaube nicht. Wenn Sie den gModifikator weglassen , wird nur das erste Auftreten eines Leerzeichenblocks ersetzt.
KooiInc
10

In einer Übereinstimmungssituation würde die erste eine Übereinstimmung pro Leerzeichen zurückgeben, während die zweite eine Übereinstimmung für jede Gruppe von Leerzeichen zurückgeben würde.

Das Ergebnis ist das gleiche, da Sie es durch eine leere Zeichenfolge ersetzen. Wenn Sie es beispielsweise durch 'x' ersetzen, würden sich die Ergebnisse unterscheiden.

str.replace(/\s/g, '') gibt 'xxAxBxxCxxxDxEF' zurück

while str.replace(/\s+/g, '')gibt 'xAxBxCxDxEF' zurück

weil \smit jedem Leerzeichen übereinstimmt, jedes durch 'x' ersetzt wird, und \s+mit Gruppen von Leerzeichen übereinstimmt, wobei mehrere aufeinanderfolgende Leerzeichen durch ein einzelnes 'x' ersetzt werden.

Doug
quelle
3

+bedeutet "ein oder mehrere Zeichen" und ohne das Plus "ein Zeichen". In Ihrem Fall führen beide zur gleichen Ausgabe.

Josh M.
quelle