/ \ 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

Answers:


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标志(替换所有出现的内容)并替换为空字符串,所以两个表达式的效果相同。


但是第二个版本可能会更快。
蒂姆·皮茨克

这是否意味着,如果我使用的是\ s +,则无需使用/ g
Gaurav,

1
@Gaurav:否。因为那样的话,它将仅替换第一个\s+,其余的保持不变。例如,' foo bar '.replace(/\s+/, '')给您只'foo bar ' 编辑将两个空格压缩为一个的argh HTML
BoltClock

@Gaurav我不这么认为。如果省略g修饰符,则仅替换第一次出现的空白块。
KooiInc

10

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

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

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

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

因为\s匹配每个空格,用“ x”替换每个空格,并且\s+匹配空格组,用一个“ x”替换多个连续的空格。


3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.