Существует ли разница между /\ s/g и /\ s +/g?

Когда у нас есть строка, содержащая пробельные символы:

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

В первом регулярном выражении каждый пробельный символ заменяется символом символом с пустой строкой.

Во втором регулярном выражении каждая непрерывная строка символов пространства заменяется пустой строкой из-за +.

Однако, как и то, как 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#

Ответ 2

\s означает "одно пространство", а \s+ означает "одно или несколько пробелов".

Но, поскольку вы используете флаг /g (заменяете все вхождения) и заменяете пустой строкой, ваши два выражения имеют одинаковый эффект.

Ответ 3

В ситуации совпадения первая будет возвращать одно совпадение за пробел, когда вторая возвращает совпадение для каждой группы пробелов.

Результат тот же, потому что вы заменяете его пустой строкой. Если вы замените его на "x" , например, результаты будут отличаться.

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

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

поскольку \s соответствует каждому пробелу, заменяя каждый на "x" , а \s+ соответствует группам пробелов, заменяя несколько последовательных пробелов одним "x" .

Ответ 4

+ означает "один или несколько символов", и без плюса это означает "один символ". В вашем случае оба результата приводят к одному и тому же выводу.