注意:似乎我必须坚持正常表达式的一个衬垫,由于我正在使用的验证库(jquery validation engine)
我有以下正则表达式:
((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!^1{1,5}[a-z]+$).{8,25})$
符合以下条件:
Minimun of 8 characters
1 lowercase character
1 uppercase character
1 digit
1 special character
这里的问题是它接受: P @ ssW0rd 和 Qw3rty * 作为有效密码。
上述内容不应通过验证。我想出了这两个表达方式,试图解决这个问题,但没有成功地将它整合到最后一块中。
p[a@][s5]{2}w[o0]rd // anything with password in it including leet variants
qw[e3]rty // anything with qwerty in it including leet variant
规则应该是:不要在单词的开头或结尾处允许任何密码或Qwerty变体。
有关如何将这些放在一起并使其有效的任何想法?
答案 0 :(得分:2)
您可以添加更多负面预见条款,如下所示吗?
(?!p[a@][s5]{2}w[o0]rd) // prevents variants of "password"
(?!qw[e3]rty) // prevents variants of "qwerty"
...得到(也加入了起始锚):
^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!^1{1,5}[a-z]+$)(?!p[a@][s5]{2}w[o0]rd)(?!qw[e3]rty).{8,25})$
但是,这可能并不是您想要的,但是为了确保您的大写字符,您必须以区分大小写的方式匹配,但表达式为"密码"和" qwerty"只有在以不区分大小写的方式匹配时才会起作用。您可能需要将其更改为以下内容:
^((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!^1{1,5}[a-z]+$)(?![pP][aA@][sS5]{2}[wW][oO0][rR][dD])(?![qQ][wW][e3][rR][tT][yY]).{8,25})$
呸!
说实话,我建议您对策略进行更根本的反思。
如果您想尝试鼓励更强的密码,为什么不包括当前密码强度的直观显示,以便您的客户可以看到他们的密码有什么问题?你甚至不必编写代码:网上有很多插件。
答案 1 :(得分:0)
您可以创建一个黑名单'在正则表达式中使用以下格式:
blacklisted_exp_1|blacklisted_exp_2| ... (original_expression)
当任何列入黑名单的表达式匹配时,整个表达式将匹配,但如果所有列入黑名单的表达式都不匹配,则原始表达式捕获组将匹配。
在你的情况下,这将是:
qw[e3]rty|P[a@][s5]{2}W[o0]rd|((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!^1{1,5}[a-z]+$).{8,25})$
这是一个更简单的示例,您可以在Web控制台中尝试:
var regex = /foo|bar|([a-z]{3})/; // Matches all 3-letter words except foo and bar
"foo".match(regex); // ["foo", undefined]
"bar".match(regex); // ["bar", undefined]
"baz".match(regex); // ["baz", "baz"]
答案 2 :(得分:0)
您可以在正则表达式中添加否定前瞻:
^((?=.*?\d)(?=.*?[a-z])(?=.*?[A-Z])(?!p[a@][s5]{2}w[o0]rd$)(?!qw[e3]rty).{8,25})$