Is there a difference between /\s/g and /\s+/g?

当我们有一个包含空格字符的字符串时:

var str = '  A B  C   D EF ';

我们希望从字符串中删除空格(我们希望这样: 'ABCDEF')。

这两个:

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

还有这个:

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

will return the correct result.

这是否意味着 +在这种情况下是多余的?在这种情况下,这两个正则表达式之间是否存在差异(例如,它们是否会以任何方式产生不同的结果) ?


更新: 性能比较-/\s+/g更快

159589 次浏览

\s表示“一个空间”,\s+表示“一个或多个空间”。

但是,由于使用了 /g标志(替换所有匹配项)并用空字符串替换,因此这两个表达式具有相同的效果。

在匹配的情况下,第一个将为每个空格返回一个匹配,而第二个将为每组空格返回一个匹配。

结果是相同的,因为要用一个空字符串替换它。例如,如果您将其替换为“ x”,结果将会有所不同。

str.replace(/\s/g, 'x')将返回‘ xxAxBxxCxxxDxEF’

str.replace(/\s+/g, 'x')将返回‘ xAxBxCxDxEF’

因为 \s匹配每个空格,将每个空格替换为‘ x’,而 \s+匹配多组空格,将多个连续的空格替换为单个‘ x’。

+表示“一个或多个字符”,如果没有加号,则表示“一个字符”在您的情况下,两者的结果是相同的。

在第一个正则表达式中,每个空格字符被一个字符一个字符地替换为空字符串。

在第二个正则表达式中,由于 +,空格字符的 每个连续的字符串被替换为空字符串。

However, just like how 0 multiplied by anything else is 0, it seems as if both methods strip spaces in exactly the same way.

如果将替换字符串更改为 '#',区别就会更加明显:

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#