仅允许使用字母数字和特殊字符的正则表达式不起作用

时间:2016-02-14 19:18:18

标签: javascript regex validation scripting

我构造了以下Regex,它允许只满足所有三个条件的字符串:

  1. 允许使用字母数字字符。
  2. 允许在Regex中定义特殊字符。
  3. 字符串长度必须为最小8和最多20个字符。
  4. 正则表达式是:

    "^(?=.*[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验证失败的原因是什么?

1 个答案:

答案 0 :(得分:1)

我看到两个主要问题。一个是在字符串"..."内,反斜杠\具有特殊含义,与正则表达式中的特殊含义无关。特别是,\d最终只会变成d - 而不是你想要的。最好的解决方法是使用/.../表示法而不是new RegExp("...")

var regPassword = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]$/;

另一个问题是你的正则表达式与你的要求不符。

实际上,你所说的要求并没有多大意义,但我猜你想要这样的东西:

  1. 必须至少包含一个小写字母,至少一个大写字母,至少一个数字,以及至少一个特殊字符$@$!%*?&
  2. 只能包含小写字母,大写字母,数字和特殊字符$@$!%*?&
  3. 总长度必须介于8到20个字符之间。
  4. 如果是这样,那么你已经管理了#1和#2,但忘记了#3。现在你的正则表达式要求长度正好为1.要解决这个问题,你需要在{8,20}部分之后添加[A-Za-z\d$@$!%*?&]

    var regPassword = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@$!%*?&])[A-Za-z\d$@$!%*?&]{8,20}$/;