4

需要正则表达式来检查字符串中任何位置的至少 3 个大写字母、3 个小写字母、3 个数字和 3 个特殊字符。

我已经尝试过/^(?=.*[^A-Za-z0-9]{3,})(?=.*[A-Z]{3,})(?=.*\d{3,})(?=.*[0-9]{3,}).+/ ,但是这个检查连续的字符串像 ::abcABC123(*)但没有检查像:1a(2b)AB*3cC

4

3 回答 3

7

你很接近:你需要.*在你的前瞻中用字符类括起来:

^(?=(.*[^A-Za-z0-9]){3})(?=(.*[A-Z]){3})(?=(.*\d){3}).+

这样做的原因是字符类型可能不相邻,例如 3 位可能是a1b2c3,因此.*允许其他中间字符类型。

请注意,您不需要开放式量词。eg(.*\d){3}足以断言至少有 3 个数字 - 即没有...{3,}


最后一点:那些前导/尾随斜杠与正则表达式没有任何关系——它们是应用程序语言的产物。如果省略,它会使问题和答案更清晰,对更多人更有用。

于 2013-05-22T10:21:00.823 回答
2
/^(?=(.*[^A-Za-z0-9]){3,})(?=(.*[A-Z]){3,})(?=(.*\d){3,})(?=.*[a-z]){3,}).+/

所以你很亲近。

于 2013-05-22T10:19:10.783 回答
1

对于与“至少 3 个小写字母”要求不匹配的字符串,其他两个答案都失败了。使用 Bohemian 的答案但支持这种情况会给出以下正则表达式:

^(?=(.*[^A-Za-z0-9]){3})(?=(.*[A-Z]){3})(?=(.*[a-z]){3})(?=(.*\d){3}).+

于 2015-03-28T20:24:58.920 回答