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+/g
jest szybsze. Zobacz tutaj: http://jsperf.com/s-vs-s
javascript
regex
Šime Vidas
źródło
źródło
\s+
, że jest szybszy, ponieważ może zastąpić fragmenty białych znaków, podczas gdy\s
musi zastępować każdą białą przestrzeń osobno?Odpowiedzi:
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#
źródło
\s
oznacza „jedną spację” i\s+
„jedną lub więcej spacji”.Ale ponieważ używasz
/g
flagi (zamień wszystkie wystąpienia) i zamieniasz na pusty ciąg, twoje dwa wyrażenia mają ten sam efekt.źródło
\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ąg
modyfikator, tylko pierwsze wystąpienie bloku białych znaków zostanie zastąpione.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ż
\s
dopasowuje 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”.źródło
+
oznacza „jeden lub więcej znaków”, a bez plusa oznacza „jeden znak”. W twoim przypadku oba dają ten sam wynik.źródło