我有以下密码验证规则:
我试图找到这个规则的正则表达式模式,最接近的是:
/^(?=.*[0-9]) (?=.*[!@#$%^&*]) (?=.*[a-z]) (?=.*[A-Z]) {8} $/
但它并不适用于所有规则。
我是正则表达式的新手,我也很欣赏任何可以学习正则表达式的资源。
答案 0 :(得分:3)
您可以考虑以下模式:
^(?=.*[0-9])(?=.*[^\w\s])(?=(?:[^a-z]*[a-z]){3})(?=.*[A-Z])(?!.*(.)\1{2})[a-zA-Z].{7,}$
请参阅regex demo(请注意\n
仅添加到[^a-z]
中,仅用于测试演示目的,以免在单个多行输入中的换行符溢出。)
<强>详情
^
- 字符串开头(?=.*[0-9])
- 1位(?=.*[^\w\s])
- 任何1个特殊字符(不是单词,也不是空白字符)(注意:如果您只想要从列表中选择特殊字符,请使用原始模式中的(?=.*[!@#$%^&*])
)< / LI>
(?=(?:[^a-z]*[a-z]){3})
- 3个小写字母(?=.*[A-Z])
- 1个大写字母(?!.*(.)\1{2})
- 没有相同的3个连续字符[a-zA-Z]
- 第一个字母是一封信.{7,}
- 然后是7个字符$
- 字符串结尾要详细了解密码验证,请参阅Lookahead Example: Simple Password Validation。
请注意,您可以使用principle of contrast来增强前瞻检查:将(?=.*[0-9])
替换为(?=[^0-9]*[0-9])
,将(?=.*[A-Z])
替换为(?=[^A-Z]*[A-Z])
,(?=.*[^\w\s])
与(?=[\w\s]*[^\w\s])
。