我有以下标准为密码创建符合以下规则的正则表达式:
密码必须包含以下4条规则中至少3条的字符:
我可以使表达式与所有这些规则匹配,并使用以下表达式:
/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.[\W]).{8,}$/
但我正在努力解决如何以这样的方式解决这个问题:它只需要解决4条规则中的任何3条。
任何人都可以帮我解决这个问题吗?
答案 0 :(得分:96)
请勿使用一个正则表达式进行检查。
if (password.length < 8)
alert("bad password");
var hasUpperCase = /[A-Z]/.test(password);
var hasLowerCase = /[a-z]/.test(password);
var hasNumbers = /\d/.test(password);
var hasNonalphas = /\W/.test(password);
if (hasUpperCase + hasLowerCase + hasNumbers + hasNonalphas < 3)
alert("bad password");
如果必须使用单个正则表达式:
^(?:(?=.*[a-z])(?:(?=.*[A-Z])(?=.*[\d\W])|(?=.*\W)(?=.*\d))|(?=.*\W)(?=.*[A-Z])(?=.*\d)).{8,}$
此正则表达式未针对效率进行优化。它由A·B·C + A·B·D + A·C·D + B·C·D
构造,带有一些因子分解。击穿:
^
(?:
(?=.*[a-z]) # 1. there is a lower-case letter ahead,
(?: # and
(?=.*[A-Z]) # 1.a.i) there is also an upper-case letter, and
(?=.*[\d\W]) # 1.a.ii) a number (\d) or symbol (\W),
| # or
(?=.*\W) # 1.b.i) there is a symbol, and
(?=.*\d) # 1.b.ii) a number ahead
)
| # OR
(?=.*\W) # 2.a) there is a symbol, and
(?=.*[A-Z]) # 2.b) an upper-case letter, and
(?=.*\d) # 2.c) a number ahead.
)
.{8,} # the password must be at least 8 characters long.
$
答案 1 :(得分:6)
你可以编写一个非常复杂的正则表达式来做到这一点。相反,我建议写四个不同的正则表达式,每个规则一个,并逐个测试它们,计算它们中有多少匹配。如果有四分之三,请接受密码。
答案 2 :(得分:6)
您可以使用以下Regex:
(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*$)?(^(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=]).*$)?(^(?=.*\d)(?=.*[A-Z])(?=.*[@#$%^&+=]).*$)?(^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$)?
密码最小长度为8,最大长度为32,您可以使用以下正则表达式:
(^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,32}$)?(^(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=]).{8,32}$)?(^(?=.*\d)(?=.*[A-Z])(?=.*[@#$%^&+=]).{8,32}$)?(^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).{8,32}$)?
答案 3 :(得分:1)
我建议单独进行检查,然后总计多少匹配。
(我也不会在其中任何一个使用正则表达式,但这只是我个人的POV - 即它们阻碍了可读性并且通常是一次性写入代码)