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

8ehkhllq  于 2023-03-04  发布在  其他
关注(0)|答案(4)|浏览(160)

我有以下条件来创建符合以下规则的密码正则表达式:
1.密码必须是8个字符长(这我可以做到:-))。
密码必须包含以下4个规则中至少3个规则中的字符:
1.大写
1.小写
1.数目
1.非字母数字
我可以使用以下表达式使表达式匹配所有这些规则:

/^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.[\W]).{8,}$/

但我正在挣扎如何做到这一点,以这样一种方式,它只需要解决4个规则中的任何3个。
有人能帮我吗?

dojqjjoe

dojqjjoe1#

不要用一个正则表达式来检查它。

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.
$
k3bvogb1

k3bvogb12#

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

ttygqcqt

ttygqcqt3#

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

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

9ceoxa924#

我建议分别做检查,然后合计有多少匹配。
(我也不会在其中任何一个中使用正则表达式,但这只是我个人的观点-即它们妨碍可读性,通常是一次性编写的代码)

相关问题