You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

密码验证正则表达式排除特定字符失效问题排查

密码正则验证问题分析与解决

嘿,咱们先一步步捋清楚你遇到的情况:

你的正则逻辑到底在查什么

你写的正则(?=.*\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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:52:31