我使用以下正则表达式来验证密码复杂性:
/^.*(?=.{6,12})(?=.*[0-9]{2})(?=.*[A-Z]{2})(?=.*[a-z]{2}).*$/
简而言之:2个小写字母,2个大写字母,2个数字,最小长度为6,最大长度为12。
当我使用最小长度时,除了最大长度之外,它工作得很好。
例如:
/^.*(?=.{6,})(?=.*[0-9]{2})(?=.*[A-Z]{2})(?=.*[a-z]{2}).*$/
这正确地要求最小长度为 6!
和这个:
/^.*(?=.{,12})(?=.*[0-9]{2})(?=.*[A-Z]{2})(?=.*[a-z]{2}).*$/
正确要求最大长度为 12。
然而,当我像第一个例子一样将它们配对时,它就是不起作用!
是什么赋予了?谢谢!
你要:
/^(?=.{6,12}$)...
你正在做的是说:找到我后面跟着的任何字符序列:
- 6-12 个字符
- 后跟 2 位数字的另一个字符序列
- 后跟 2 个大写字母的另一个字符序列
- 后跟 2 个小写字母的另一个字符序列
接下来是另一个字符序列。这就是最大长度不起作用的原因,因为 30 个字符后跟 00AAaa 和另外 30 个字符将通过。
另外你正在做的是强制两个数字together。不那么严格,但要求字符串中的任何位置至少有两个数字:
/^(?=.{6,12}$)(?=(.*?\d){2})(?=(.*?[A-Z]){2})(?=(.*?[a-z]){2})/
最后你会注意到我使用的是非贪婪表达式(.*?
)。这将避免lot回溯和这种验证是您通常应该使用的。和...之间的不同:
(.*\d){2}
and
(.*?\d){2}
是第一个会抓住所有字符.*
然后寻找一个数字。它找不到一个,因为它将位于字符串的末尾,因此它将回溯一个字符,然后查找一个数字。如果它不是数字,它将继续回溯,直到找到一个数字。完成之后,它将再次匹配整个表达式,这将触发更多的回溯。
就是这样贪婪的通配符 means.
第二个版本将传递零个字符.*?
并寻找一个数字。如果不是数字.*?
将抓取另一个字符,然后查找数字,依此类推。特别是在长搜索字符串上,这可以快几个数量级。对于短密码来说,几乎肯定不会产生什么影响,但了解正则表达式匹配器的工作原理并尽可能编写最好的正则表达式是一个好习惯。
话虽这么说,这可能是一个为了自己的利益而过于聪明的例子。如果密码因不满足这些条件而被拒绝,您如何确定哪个密码失败,以便向用户提供有关修复问题的反馈?实际上,程序化解决方案可能更可取。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)