Czy jest różnica między / \ s / g i / \ s + / g?


89

Kiedy mamy ciąg zawierający znaki spacji:

var str = '  A B  C   D EF ';

i chcemy usunąć spacje z ciągu (chcemy tego 'ABCDEF':).

Zarówno to:

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

i to:

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

zwróci prawidłowy wynik.

Czy to oznacza, że +jest zbędny w tej sytuacji? Czy w tej sytuacji istnieje różnica między tymi dwoma wyrażeniami regularnymi (na przykład, czy w jakikolwiek sposób mogą one dać różne wyniki)?


Aktualizacja: Porównanie wydajności - /\s+/gjest szybsze. Zobacz tutaj: http://jsperf.com/s-vs-s


1
vidas stackoverflow.com/questions/5963182/… Założę się, że to właśnie spowodowało, że
zadałeś

2
Mogę sobie wyobrazić \s+, że jest szybszy, ponieważ może zastąpić fragmenty białych znaków, podczas gdy \smusi zastępować każdą białą przestrzeń osobno?
KooiInc

1
@KooiInc: Poprawnie, ponieważ pasuje / zastępuje mniej razy.
BoltClock

Odpowiedzi:


219

W pierwszym wyrażeniu regularnym każdy znak spacji jest zastępowany, znak po znaku, pustym ciągiem.

W drugim wyrażeniu regularnym każdy ciągły ciąg znaków spacji jest zastępowany pustym ciągiem z powodu+ .

Jednak, podobnie jak w przypadku pomnożenia 0 przez cokolwiek innego daje 0, wydaje się, że obie metody usuwają spacje dokładnie w ten sam sposób.

Jeśli zmienisz ciąg zastępujący na '#', różnica stanie się znacznie wyraźniejsza:

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

\soznacza „jedną spację” i \s+„jedną lub więcej spacji”.

Ale ponieważ używasz /gflagi (zamień wszystkie wystąpienia) i zamieniasz na pusty ciąg, twoje dwa wyrażenia mają ten sam efekt.


Ale druga wersja będzie prawdopodobnie szybsza.
Tim Pietzcker

czy to znaczy, nie muszę używać / g, jeśli używam \ s +
Gaurav

1
@Gaurav: Nie. Ponieważ wtedy zastąpiłoby tylko pierwszą \s+, pozostawiając resztę nietkniętą. Na przykład, ' foo bar '.replace(/\s+/, '')da ci tylko 'foo bar ' edycję argh HTML skondensowaną dwie spacje w jedną
BoltClock

@Gaurav Nie sądzę. Jeśli pominiesz gmodyfikator, tylko pierwsze wystąpienie bloku białych znaków zostanie zastąpione.
KooiInc

10

W sytuacji dopasowania pierwsza zwróciłaby jedno dopasowanie na każdą białą przestrzeń, podczas gdy druga zwróciłaby dopasowanie dla każdej grupy białych znaków.

Wynik jest taki sam, ponieważ zastępujesz go pustym ciągiem. Jeśli zastąpisz go na przykład „x”, wyniki będą się różnić.

str.replace(/\s/g, '') zwróci „xxAxBxxCxxxDxEF”

podczas str.replace(/\s+/g, '') zwróci „xAxBxCxDxEF”

ponieważ \sdopasowuje każdą białą spację, zamieniając każdą na „x” i \s+dopasowuje grupy białych znaków, zastępując wiele kolejnych białych znaków pojedynczym „x”.


3

+oznacza „jeden lub więcej znaków”, a bez plusa oznacza „jeden znak”. W twoim przypadku oba dają ten sam wynik.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.