正则表达式匹配两个或更多相同字符(不连续)

6

如何获得一个正则表达式,匹配任何包含两个或更多逗号的字符串?
我想通过举例来更好地解释应该匹配和不应该匹配的内容。

abcd,ef // Nop
abc,de,fg // Yup

// This is what I have so far, but it only matches consecutive commas
var patt = /\,{2,}/;

我对正则表达式不是很熟悉,也没有找到有用的东西。希望能得到帮助。


你是说你不想匹配连续的冒号吗?(还是说那是你目前为止所能匹配的全部内容?)你的示例都没有涵盖这两种情况。你是在寻找冒号(:)还是逗号(,)? - nnnnnn
哦,逗号打错了。我想匹配任何有两个或更多逗号的字符串,无论它们在哪里。 - elclanrs
2个回答

15

这将匹配至少有两个逗号(不是冒号)的字符串:

/,[^,]*,/

上面的表达式表示“匹配逗号,后跟任意数量的非逗号字符,再后跟另一个逗号”。你也可以使用下面这个表达式:

/,.*?,/

.*?类似于.*,但它尽可能匹配少的字符而不是尽可能多的字符。这被称为“勉强”限定符。(希望你所选择的语言支持它们!)

有人建议使用/,.*,/。这是一个非常糟糕的想法,因为它会一直在整个字符串上搜索,而不是在找到前两个逗号后停止。如果字符串很大,这可能会非常慢。


1
他只是说“两个或更多逗号”,并没有说它们必须由非逗号分隔。因此,,.*,可能更合适。 - mpen
@elclanrs,我刚刚在答案中添加了一些解释。如果您正在尝试解决另一个问题,请发布另一个问题,并在此处链接到它。 - Alex D
2
@Mark,抱歉,但我发布的正则表达式更好。它将匹配任何包含2个逗号的字符串,并且比你的更有效率,特别是如果字符串非常长。 - Alex D
@AlexD:我只听说过.*?被称为“懒惰匹配”(与“贪婪匹配”相对)。我对于,.*?,比贪婪版本更高效还是更低效持怀疑态度;我想这取决于实现和使用的方法。例如,“test”或“IsMatch”函数(返回布尔值而不是匹配对象)应该在第一次匹配时退出。当然,需要进行性能测试,但说“远远更高效”有点大言不惭。在大多数情况下,我们谈论的是不到一毫秒的时间。 - mpen
事实上,我已经测试过了:http://jsperf.com/greedy-vs-non-greedy-regex 在FF10中,贪婪版本的性能实际上比非贪婪版本高出19%。 - mpen
显示剩余8条评论

1

如果你想要得到一个给定字符串中逗号的数量,只需使用 /,/g,并获取匹配的长度

'a,b,c'.match(/,/g);    //[',',','] length equals 2<br/>
'a,b'.match(/,/g);    //[','] length equals 1<br/>
'ab'.match(/,/g)    //result is null

'a,b,c'.match(/,/g).length >= 2会提供OP想要的结果。 - mpen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接