密码要求是:
这个很接近但不起作用:
/^(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W]).{8,}$/
我做错了什么?
答案 0 :(得分:3)
此正则表达式符合您的要求:
/^(?=(?:[^a-z]*[a-z]){2})(?=(?:[^0-9]*[0-9]){2})(?=.*[!-\/:-@\[-`{-~]).{8,}$/i
与the demo一起玩,看看哪些匹配并且不匹配。
<强>解释强>
i
标记使其不区分大小写,因此我们不必说a-zA-Z
^
锚点断言我们位于字符串的开头(?=(?:[^a-z]*[a-z]){2})
断言在此位置(字符串的开头)后面的内容是任何不是字母的字符,后跟一个字母......两次,确保至少有两个字母(?=(?:[^0-9]*[0-9]){2})
断言在这个位置后面(仍然是字符串的开头)是任何不是数字的字符,后跟一个数字......两次,确保至少有两个字母(?=.*[!-\/:-@\[-
{ - 〜])`断言在此位置后面(仍然是字符串的开头)是任何字符,后跟一个特殊字符$
锚点断言我们位于字符串的末尾关于特殊字符的说明
正则表达式[!-\/:-@\[-
{ - 〜]`专门挑选出所有可打印的字符,既不是数字也不是来自the ASCII table的字母。如果这包括您不想要的字符,请使其更具限制性。
答案 1 :(得分:2)
正则表达式可能不合适;很难看一下你所拥有的正则表达式,并立即知道要求是什么,更不用说如何修改它们了。您可能只想直接计算每个组中的字符数,然后检查这些计数是否都通过了适当的阈值。
这就是说:考虑到这会强制执行真正尴尬的密码,但却禁止xkcd-style passwords。我强烈建议您采用更具启发性的方法,其中较长的密码会放宽其他限制。执行强密码还有其他注意事项,例如与字典单词的相似性和唯一字符的数量。
老实说,你可能最好只需要密码短语:)
答案 2 :(得分:1)
我说:
/^(?=.*\d.*\d)(?=.*[a-zA-Z].*[a-zA-Z])(?=.*[\W]).{8,}$/
您的正则表达式缺少 2 数字和 2 字母要求。
答案 3 :(得分:0)
怎么样:
/^(?=.{2,}\d)(?=.{2,}[a-zA-Z])(?=.*[\W]).{8,}$/
它应该符合你的要求。
答案 4 :(得分:0)
取决于您认为的“特殊角色”。如果特殊字符不是数字或字母,并且密码中不允许使用空格,则:
^(?=(?:\S*\d){2})(?=(?:\S*[A-Za-z]){2})(?=\S*[^A-Za-z0-9])\S{8,}
或者,与“逃脱”:
"^(?=(?:\\S*\\d){2})(?=(?:\\S*[A-Za-z]){2})(?=\\S*[^A-Za-z0-9])\\S{8,}"
如果您选择允许空格,请用点替换\ S.
如果要将“特殊字符”定义为仅包含某些字符,或者除了字母和数字之外还要排除其他字符,请在最后一个前瞻中编辑字符类。