正则表达式排除某些字符是行不通的

时间:2018-04-12 15:22:32

标签: regex

我试图为密码输入创建一个正则表达式,用户必须输入至少一个数字,一个大写字母,一个小写字母和除星号和百分号以外的任何一个符号,并且必须是至少十五个字符。到目前为止,我已经想出了这个:

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z\d*%]).{15,}

但是当我在RegexR上测试时,我尝试输入以下字符串ILovePizza1234!!!*然后通过。这个表达有什么问题?请帮助,并提前感谢任何提示

1 个答案:

答案 0 :(得分:2)

您的前瞻断言(?=.*[^A-Za-z\d*%])会检查是否至少有一个字符,除了字母数字,百分号或星号。它不禁止存在任何星号/百分号。因此,只要至少有一个字符匹配[^A-Za-z\d*%](测试字符串中!满足的条件),该断言就会成功。

您需要额外的negative lookahead assertion

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[^A-Za-z\d])(?!.*[*%]).{15,}
如果字符串中的任何位置存在(?!.*[*%])*

%将导致正则表达式匹配失败。