密码验证正则表达式排除特定字符失效问题排查
密码正则验证问题分析与解决
嘿,咱们先一步步捋清楚你遇到的情况:
你的正则逻辑到底在查什么
你写的正则(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z\d*%]).{15,}其实是这么几个要求的组合:
- 必须有至少一个数字
- 必须有至少一个小写字母
- 必须有至少一个大写字母
- 必须有至少一个**不是字母、数字、*、%**的字符
- 总长度得超过15位
为什么测试用例能通过
你测试的字符串ILovePizza1234!!!*完全踩中了所有符合要求的点:
- 数字有
1234,满足; - 大写字母有开头的
I,满足; - 小写字母是
LovePizza这一串,满足; - 关键的符号部分:里面的
!!!属于「非字母、数字、、%」的范畴,刚好满足“至少一个除%外的符号”的要求; - 数一下长度:10个字母+4个数字+3个!+1个*,一共18位,远超15位的要求。
所以这个输入通过验证是完全符合你设定的规则的,你的正则本身在这里并没有问题哦。
如果你其实是想禁止密码里出现*和%
要是你真实需求是「密码里不能有或%,同时还要有其他符号」,那你的正则就需要调整了——当前的正则只是要求存在一个非%的符号,但允许密码里同时混有或%。这种情况下,得把禁止%的规则加到整个字符串的匹配里:
调整后的正则应该是这样:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z\d])[^*%]{15,}$
我给你解释下调整的点:
- 加了
^和$锚定整个字符串,避免出现字符串前后有额外字符也能匹配的情况(比如原正则如果输入是xxx你的测试密码xxx也会通过,加锚定后就只会匹配完整的符合要求的密码); (?=.*[^A-Za-z\d]):确保密码里有至少一个非字母数字的符号(因为后面已经禁止了*%,所以这个符号自然不是*或%);[^*%]{15,}:直接限制整个密码里不能出现*和%,同时保证长度至少15位。
小提醒
不管需求是哪种,都建议加上^和$锚定,这样能避免很多边界场景的误匹配哦。
内容的提问来源于stack exchange,提问作者gfcf14
相关产品推荐
相关产品推荐

