5

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

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

例子 :

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

我的失败尝试:

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

谢谢。

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

4

3 回答 3

11

好吧,出于学习的目的,我建议通读这个非常全面的教程

否则,JavaScript 正则表达式可能看起来像这样:

如果您想确保至少有三位数字:

/^(?:\D*\d){3}/

或者,如果您想确保恰好是三个数字:

/^(?:\D*\d){3}\D*$/

\D是任何非数字字符。*允许其中的 0 个或更多。\d是任何数字字符。{3}重复子模式 3 次。And^$分别标记字符串的开始和结束。

于 2012-11-25T09:16:56.977 回答
3

你也可以这样做:

str.match(/\d/g).length >= 3

这非常简单,并且非常清楚地显示了没有复杂正则表达式的意图。

不过,这并没有针对速度进行调整。

于 2012-11-25T09:25:15.337 回答
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)

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

于 2012-11-25T09:31:05.483 回答