为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式以强制执行复杂密码,匹配4个规则中的3个

正则表达式以强制执行复杂密码,匹配4个规则中的3个

小怪兽爱吃肉 2019-08-08 16:53:55
正则表达式以强制执行复杂密码,匹配4个规则中的3个我有以下标准为密码创建符合以下规则的正则表达式:密码长度必须为8个字符(我可以这样做:-))。然后,密码必须包含以下4条规则中至少3条的字符:大写小写数字非字母数字我可以使表达式与所有这些规则匹配,并使用以下表达式:/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.[\W]).{8,}$/但我正在努力解决如何以这样的方式做到这一点,它只需要解决4条规则中的任何3条。任何人都可以帮我解决这个问题吗?
查看完整描述

3 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

然后不要使用一个正则表达式进行检查。


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.

$


查看完整回答
反对 回复 2019-08-08
?
慕后森

TA贡献1802条经验 获得超5个赞

可以编写一个非常复杂的正则表达式来做到这一点。相反,我建议写四个不同的正则表达式,每个规则一个,并逐个测试它们,计算它们中有多少匹配。如果有四分之三,请接受密码。


查看完整回答
反对 回复 2019-08-08
?
蛊毒传说

TA贡献1895条经验 获得超3个赞

您可以使用以下正则表达式:

(^(?=.*\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}$)?



查看完整回答
反对 回复 2019-08-08
  • 3 回答
  • 0 关注
  • 1220 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信