首页 > 解决方案 > 正则表达式密码至少一个字符来自三个 3 类别

问题描述

我需要一个正则表达式来检查: 包含以下三 (4) 个类别中的至少一 (1) 个字符:

不是必须来自所有 4 个类别,至少可以来自 3 个类别

标签: javaregex

解决方案


如果满足任何三个条件,您想要四个条件,那么它应该接受密码,您需要提前查看所有不同的排列/组合。你可以使用这个正则表达式,

^(?:(?=.*[a-z])(?=.*[A-Z])(?=.*[\d~`!@#$%^&*()+=_{}\[\]\|:;”’?\/<>,.-])|(?=.*[a-z])(?=.*\d)(?=.*[A-Z~`!@#$%^&*()+=_{}\[\]\|:;”’?\/<>,.-])|(?=.*[a-z])(?=.*[~`!@#$%^&*()+=_{}\[\]\|:;”’?\/<>,.-])(?=.*[A-Z\d])|(?=.*[A-Z])(?=.*\d)(?=.*[a-z~`!@#$%^&*()+=_{}\[\]\|:;”’?\/<>,.-])|(?=.*[A-Z])(?=.*[~`!@#$%^&*()+=_{}\[\]\|:;”’?\/<>,.-])(?=.*[a-z\d])|(?=.*\d)(?=.*[~`!@#$%^&*()+=_{}\[\]\|:;”’?\/<>,.-])(?=.*[a-zA-Z])).*$

如您所见,正则表达式变得太大而无法解释,让我简要介绍一下此处应用的概念。

由于有四个字符集,其中如果密码包含任何三个字符中的至少一个,则您接受,因此您需要提前检查两个字符集,然后第三个字符集可以与剩下两个来检查是否至少一个字符来自剩余的一个。并将此逻辑与所有此类排列一起应用并交替所有情况。让我换一个例子来给你解释一下。像这样,

(?=.*[a-z])(?=.*[A-Z])(?=.*[\d~`!@#$%^&*()+=_{}\[\]\:;”’?\/<>,.-])

在这里它检查密码是否包含小写,大写,然后在剩余的集合中是数字和特殊字符可以组合,因为我们只需要在数字或特殊字符集中匹配任何一个字符。

相同的逻辑可以应用不同的字符集组成,并交替组合以匹配任何组合,从而为您提供密码的有效性。

这是一个有效的在线演示

我已经采取了各种示例来说明如果密码仅属于两个字符集,则密码将不匹配,并且仅在包含剩余字符集中的一个字符时才会开始匹配。

希望这可以帮助。如果您有任何疑问,请告诉我。


推荐阅读