3位数的正则表达式(永远不要介意订单)?

时间:2012-11-25 09:14:20

标签: javascript regex

是否有正则表达式(!)可以测试一个字符串是否包含3位数(从不介意顺序)?

(至少3位数。我也很高兴看到确切的3解决方案。(如果你很善良))

示例:

abk2d5k6 //3 digits
abk25k6d //same here //3 digits

我的失败尝试:

.+?(?=\d){3}

感谢。

(出于学习目的,请仅使用正则表达式解决方案。)。

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)

基本上,如果它是“至少”匹配,则不需要锚点。