我构造了以下Regex,它允许只满足所有三个条件的字符串:
正则表达式是:
"^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]$"
我使用以下Javascript代码验证输入:
var regPassword = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]$");
regPassword.test(form.passwordField.value);
test()
方法会为false
等输入返回abc123!ZXCBN
。我试图在正则表达式中找到问题而没有任何成功。导致Regex验证失败的原因是什么?
答案 0 :(得分:1)
我看到两个主要问题。一个是在字符串"..."
内,反斜杠\
具有特殊含义,与正则表达式中的特殊含义无关。特别是,\d
最终只会变成d
- 而不是你想要的。最好的解决方法是使用/.../
表示法而不是new RegExp("...")
:
var regPassword = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]$/;
另一个问题是你的正则表达式与你的要求不符。
实际上,你所说的要求并没有多大意义,但我猜你想要这样的东西:
$@$!%*?&
。$@$!%*?&
。如果是这样,那么你已经管理了#1和#2,但忘记了#3。现在你的正则表达式要求长度正好为1.要解决这个问题,你需要在{8,20}
部分之后添加[A-Za-z\d$@$!%*?&]
:
var regPassword = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,20}$/;