检查字符串是否包含至少10个数字、12个大写字母和20个小写字母。

4
什么是至少包含10个数字,12个大写字母和10个小写字母的正则表达式?
字符串可以以上述任何一个开头,并且可以随机放置。例如:AB12jgGGfWisLWfoi34R32SgD42DSf3453jfh
我使用了(?=.*\\d.*\\d)(?![.\\n])(?=.*[A-Z].*[A-Z])(?=.*[a-z].*[a-z]).*$来至少匹配两个大写字母、两个小写字母和两个数字。但在表达式中添加10个重复的\\d似乎不是一个好的做法。
此外,使用\\d{10}不能按照我们期望的方式匹配连续的10个数字。

请参见 https://dev59.com/tmAg5IYBdhLWcg3w_vOE。 - sashoalm
3
希望这不是密码“强度”检查和规则 :-) - Captain
1
将此检查分为3个单独的步骤会更容易(也更易于维护)。第1步:检查字符串是否包含至少10个数字。步骤2和3应该很明显。正则表达式非常适用于简单的事情,但是在某些情况下,它们只会让解决方案变得更加困难。 - Uyghur Lives Matter
@captain:我实际上是在尝试使用上述正则表达式创建密码过滤器,这不是一个合适的方法吗? - 230490
2
@230490:使用正则表达式创建密码过滤器是合适的...但是,需要密码至少包含“10个数字、12个大写字母和20个小写字母”才合适,这是另一个问题!! - Captain
1个回答

6
您可以使用这个正则表达式:
^(?=(.*?\d){10})(?=(.*?[A-Z]){12})(?=(.*?[a-z]){10})[a-zA-Z0-9]+$

正则表达式演示

甚至可以使用更高效的正则表达式:

^(?=(?:\D*\d){10})(?=(?:[^A-Z]*[A-Z]){12})(?=(?:[^a-z]*[a-z]){10})[a-zA-Z0-9]+$

这是因为否定模式比懒惰量词.*?更有效(感谢@nhahtdh)。

3
好的,我们再来一次。事实上,与.*?相比,.*会减慢这个正则表达式的速度。如果您打开上面的演示链接并单击“正则表达式调试器”,您将看到完成 169 步。现在将正则表达式中所有的.*?替换为.*,然后再点击同一菜单选项。它现在将显示完成 65450 步。不知道这个regex101调试信息有多可靠,但这是一个巨大的差异。 - anubhava
是的,看起来是这样。在使用 .* 的情况下,需要进行大量的回溯。我猜 .* 会更慢,但是步骤数量总是不确定的。 - vks
2
在同一主题上,您可能希望使用否定字符类明确指定 .*?:https://regex101.com/r/bT3nB2/2(失败案例,34步)与 https://regex101.com/r/gJ1bG5/1(失败案例,4k步)进行比较。 - nhahtdh
1
完全同意,否定形式总是比懒惰量词更有效。我会进行编辑以澄清。 - anubhava
1
这个正则表达式能行吗?(?=(.\d){10})(?=(.[A-Z]){12})(?=(.[a-z]){10}).$ - 230490
显示剩余3条评论

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