正则表达式仅允许指定特殊字符的密码验证问题
正则表达式仅允许指定特殊字符的密码验证问题
嘿,我明白你的问题所在了!你现在的正则只做了「必须包含哪些类型字符」的检查,但没做「只能包含这些允许的字符」的限制,所以只要满足了大写、小写、数字、指定特殊字符这几个条件,哪怕混入了不在列表里的字符(比如+),验证依然会通过。
问题出在哪?
你的现有正则:
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#\$%&\*])(?=.{8,})
这串代码里的所有(?=...)都是正向预查,它们只负责验证字符串里存在对应的字符类型,但并没有限制整个字符串的字符范围——也就是说,只要字符串里有大写、小写、数字、指定特殊字符,剩下的部分不管是什么字符,正则都不会管。
修正后的正则
我们只需要在正则的末尾加上「限定整个字符串只能由允许的字符组成」的规则,同时可以把长度检查和字符范围合并,让正则更简洁:
^(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*[!@#\$%&\*])[A-Za-z0-9!@#$%&*]{8,}$
各部分解释
^:匹配字符串的开头(?=.*[A-Z]):确保至少包含一个大写字母(?=.*[a-z]):确保至少包含一个小写字母(?=.*[0-9]):确保至少包含一个数字(?=.*[!@#\$%&\*]):确保至少包含一个指定的特殊字符(注意$需要转义,因为它在正则里是结尾符号)[A-Za-z0-9!@#$%&*]{8,}:限定整个字符串只能由这些允许的字符组成,且长度至少为8位$:匹配字符串的结尾
测试案例
- 符合要求的密码:
MyPass123!、abcDEF456#→ 验证通过 - 不符合要求的密码:
MyPass123!+(包含了不在允许列表的+)、mypass123(缺少大写字母和特殊字符)→ 验证失败
备注:内容来源于stack exchange,提问作者badrobot15




