/ \ s / g和/ \ s + / g之间有区别吗?

时间:2011-05-11 12:39:28

标签: javascript regex

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

var str = '  A B  C   D EF ';

我们想从字符串中删除空格(我们想要这个:'ABCDEF')。

这两个:

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

和此:

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

将返回正确的结果。

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


更新:效果比较 - /\s+/g更快。见这里:http://jsperf.com/s-vs-s

4 个答案:

答案 0 :(得分:184)

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

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

然而,就像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#

答案 1 :(得分:20)

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

但是,因为你正在使用/g标志(替换所有出现)并用空字符串替换,所以你的两个表达式具有相同的效果。

答案 2 :(得分:9)

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

结果是一样的,因为你用空字符串替换它。例如,如果用'x'替换它,结果会有所不同。

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

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

因为\s匹配每个空格,用'x'替换每个空格,\s+匹配空格组,用单个'x'替换多个连续的空格。

答案 3 :(得分:2)

+表示“一个或多个字符”,没有加号表示“一个字符”。在你的情况下,两者都会产生相同的输出。