2011-05-11 42 views
53

当我们有一个包含空格字符的字符串:是否有/ S/G和/ S + /克之间的差?

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 http://stackoverflow.com/questions/5963182/how-to-remove-spaces-from-a- string -using-javascript/5963256我敢打赌,这是什么让你问这个问题;)(你对此问题的评论) – rsplak 2011-05-11 12:46:01

+0

我能想象得到'\ s +'更快,因为它可以代替大量的空白,'\ s'必须分别替换每个空格吗? – KooiInc 2011-05-11 12:48:49

+0

@KooiInc:正确,因为它匹配/替换次数更少。 – BoltClock 2011-05-11 12:49:59

回答

150

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

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

但是,就像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# 
15

\s的意思是“一个空间”,并\s+的意思是“一个或多个空格”。

但是,由于您使用的/g标志(全部替换),并用空字符串替换,你的两个表达式有同样的效果。

+0

但是第二个版本可能会更快。 – 2011-05-11 12:43:55

+0

这是否意味着,如果我使用\ s + – Gaurav 2011-05-11 12:45:04

+1

@Gaurav:不需要使用/ g,因为那样它将只替换第一个'\ s +',而其余部分保持不变。例如,''foo bar'.replace(/ \ s + /,'')'只会给你''foo bar''*编辑argh HTML将两个空格合并为一个* – BoltClock 2011-05-11 12:45:57

7

在匹配情况第一将返回每个空白一个匹配,当第二将返回匹配的每个组的空格。

结果,因为你用一个空字符串替换它是一样的。例如,如果将它替换为“x”,结果将会不同。

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

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

因为\s匹配每个空白,取代每一个与“X”,和空格的\s+比赛基,取代多个顺序空格与一个'x'。

2

+是指“一个或多个字符”和没有加上它的意思是“一个字符”。在你的情况下,两者都会产生相同的输出。

相关问题