JavaScript正则表达式 - 无序字符串中特定数量的字符

5

我想测试一个无序字符串中是否有5个“3”。

例如:

var re = /3{5}/;
re.test("333334"); //returns true as expected
re.test("334333"); //returns false since there is no chain of 5 3s

什么正则表达式可以使第二行返回 true?如果正则表达式不是测试这个的最佳方式,那什么是最佳方式呢?
谢谢!
4个回答

6

请尝试

(str.match(/3/g) || []).length >= 5

或者

str.split(3).length > 5

在这里str是您想要测试的字符串。


应该是 str.split('3')(带引号)。已为您修复。 - Sasha Chedygov
1
ES5规范第15.5.4.14节中,第8步说明:“*如果separator是一个RegExp对象(它的[[Class]]是“RegExp”),则让R=separator;否则让R=ToString(separator)*”。 - Oriol
@Oriol:谢谢你的澄清,我之前不知道这个。虽然我还是更喜欢用引号,但这只是我的个人偏好。 :) - Sasha Chedygov
@SashaChedygov 还要注意,split 方法需要使用 > 而不是 >=,因为它会计算一个额外的项:''.split(3).length === 1'3'.split(3).length === 2,以此类推。 - Oriol

3
您可以这样写:
var re = /(?:3[^3]*){5}/;

嗨,我是正则表达式的新手,对于捕获括号有些困惑。根据MDN的说法,这将匹配'3 [^ 3] *'但不会记住匹配项。这到底意味着什么? - Ativ
1
@Ativ:是的,(?:...) 是非捕获括号。目的只是为了分组,以便能够将 {5} 量词因子化。捕获组将存储要稍后重用的内容(使用反向引用)。但在这里不需要。使用非捕获组显然使用更少的内存,并且速度稍快。 - Casimir et Hippolyte

2
我会选择
s.replace(/[^3]/,'').length >= 5

假设要测试的字符串名为 s

0
我会选择:
string.indexOf('33333') > -1

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