Чи існує різниця між / \ s / g та / \ s + / g?


87

Коли ми маємо рядок, який містить пробіли:

var str = '  A B  C   D EF ';

і ми хочемо видалити пробіли з рядка (ми хочемо це 'ABCDEF':).

І це:

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

і це:

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

поверне правильний результат.

Чи означає це, що +зайве у цій ситуації? Чи є різниця між цими двома регулярними виразами в цій ситуації (як, наприклад, чи вони можуть якимось чином дати різні результати)?


Оновлення: Порівняння продуктивності - /\s+/gшвидше. Дивіться тут: http://jsperf.com/s-vs-s


1
vidas stackoverflow.com/questions/5963182/… Б'юся об заклад, саме це змусило вас задати це питання;) (ваш коментар до відповіді)
rsplak

2
Я можу уявити, що \s+це швидше, тому що він може замінити шматки пробілів, тоді як \sкожен пробіл повинен замінити окремо?
KooiInc

1
@KooiInc: Правильно, оскільки воно збігається / замінює менше разів.
BoltClock

Відповіді:


214

У першому регулярному виразі кожен пробіл замінюється символом за символом порожнім рядком.

У другому регулярному виразі кожен суміжний рядок пробілів замінюється порожнім рядком через +.

Однак, подібно до того, як 0, помножене на будь-що інше, дорівнює 0, здається, ніби обидва методи позбавляють пробіли абсолютно однаково.

Якщо змінити рядок заміни на '#', різниця стає набагато чіткішою:

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#

27

\sозначає "один пробіл" і \s+означає "один або кілька пробілів".

Але оскільки ви використовуєте /gпрапор (замінюйте всі випадки) і замінюєте порожнім рядком, ваші два вирази мають однаковий ефект.


Але друга версія, швидше за все, буде швидшою.
Тім Пітцкер,

це означає, мені не потрібно використовувати / g, якщо я використовую \ s +
Gaurav,

1
@Gaurav: Ні. Бо тоді він замінив би лише перший \s+, залишивши решту недоторканою. Наприклад, ' foo bar '.replace(/\s+/, '')надасть вам можливість 'foo bar ' редагувати
BoltClock

@Gaurav Я не думаю. Якщо ви опустите gмодифікатор, буде замінено лише перше виникнення блоку пробілів.
KooiInc

10

У ситуації збігу перший повертав би один збіг на пробіл, а другий - збіг для кожної групи пробілів.

Результат той самий, оскільки ви замінюєте його порожнім рядком. Наприклад, якщо замінити його на "x", результати будуть відрізнятися.

str.replace(/\s/g, '') поверне 'xxAxBxxCxxxDxEF'

while str.replace(/\s+/g, '')поверне 'xAxBxCxDxEF'

тому що \sзбігається з кожним пробілом, замінюючи кожен на «x», і \s+збігається з групами пробілів, замінюючи кілька послідовних пробілів на один «x».


3

+означає "один або кілька символів", а без плюса означає "один символ". У вашому випадку обидва результати отримують однакові результати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.