我试图为密码输入创建一个正则表达式,用户必须输入至少一个数字,一个大写字母,一个小写字母和除星号和百分号以外的任何一个符号,并且必须是至少十五个字符。到目前为止,我已经想出了这个:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z\d*%]).{15,}
但是当我在RegexR上测试时,我尝试输入以下字符串ILovePizza1234!!!*
然后通过。这个表达有什么问题?请帮助,并提前感谢任何提示
答案 0 :(得分:2)
您的前瞻断言(?=.*[^A-Za-z\d*%])
会检查是否至少有一个字符,除了字母数字,百分号或星号。它不禁止存在任何星号/百分号。因此,只要至少有一个字符匹配[^A-Za-z\d*%]
(测试字符串中!
满足的条件),该断言就会成功。
您需要额外的negative lookahead assertion:
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z\d])(?!.*[*%]).{15,}
如果字符串中的任何位置存在(?!.*[*%])
或*
, %
将导致正则表达式匹配失败。