是否有正则表达式(!)可以测试一个字符串是否包含3位数(从不介意顺序)?
(至少3位数。我也很高兴看到确切的3解决方案。(如果你很善良))
示例:
abk2d5k6 //3 digits
abk25k6d //same here //3 digits
我的失败尝试:
.+?(?=\d){3}
感谢。
(出于学习目的,请仅使用正则表达式解决方案。)。
答案 0 :(得分:11)
嗯,出于学习目的,我建议仔细阅读这篇非常全面的tutorial。
否则,JavaScript正则表达式可能如下所示:
如果您想确保至少有三位数字:
/^(?:\D*\d){3}/
或者,如果您想确保正好有三位数字:
/^(?:\D*\d){3}\D*$/
\D
是任何非数字字符。 *
允许0或更多。 \d
是任何数字字符。 {3}
重复子模式3次。 ^
和$
分别标记字符串的开头和结尾。
答案 1 :(得分:3)
您也可以这样做:
str.match(/\d/g).length >= 3
这很简单,并且非常清楚地显示没有复杂正则表达式的意图。
虽然这并未针对速度进行调整。
答案 2 :(得分:2)
鉴于你的评论,你想要“至少”三位数,我认为它不应该比任何更复杂:
/\d.*\d.*\d/
...这是一个数字,然后是零或更多的任何东西,然后是另一个数字,然后是零或更多的任何东西,然后是另一个数字。由于我没有锚定任何一端,两端都隐含着“零或更多”。
console.log(!!"abk2d5k6".match(/\d.*\d.*\d/)); // true
console.log(!!"abk25k6d".match(/\d.*\d.*\d/)); // true
console.log(!!"abkd5k6".match(/\d.*\d.*\d/)); // false (I removed a digit)
console.log(!!"abk2k6d".match(/\d.*\d.*\d/)); // false (I removed a digit)
或
/(\d.*){3}/
console.log(!!"abk2d5k6".match(/(\d.*){3}/)); // true
console.log(!!"abk25k6d".match(/(\d.*){3}/)); // true
console.log(!!"abkd5k6".match(/(\d.*){3}/)); // false (I removed a digit)
console.log(!!"abk2k6d".match(/(\d.*){3}/)); // false (I removed a digit)
或m.buettner在下面的评论中指出,而不是.
您可以使用\D
(不是数字):
/\d\D*\d\D*\d/
或
/(\d\D*){3}/
display(!!"abk2d5k6".match(/\d\D*\d\D*\d/)); // true
display(!!"abk25k6d".match(/\d\D*\d\D*\d/)); // true
display(!!"abkd5k6".match(/\d\D*\d\D*\d/)); // false (I removed a digit)
display(!!"abk2k6d".match(/\d\D*\d\D*\d/)); // false (I removed a digit)
display(!!"abk2d5k6".match(/(\d\D*){3}/)); // true
display(!!"abk25k6d".match(/(\d\D*){3}/)); // true
display(!!"abkd5k6".match(/(\d\D*){3}/)); // false (I removed a digit)
display(!!"abk2k6d".match(/(\d\D*){3}/)); // false (I removed a digit)
基本上,如果它是“至少”匹配,则不需要锚点。