HTML5模式正则表达式密码匹配

时间:2013-06-07 13:40:59

标签: javascript regex

使用以下规则寻找验证密码的帮助:

8+个字符

包含至少1个大写字母

包含至少1个小写字母

包含至少1个数字

无法以数字开头

不包含特殊字符

我得到了:

(?=.*\d.*)(?=.*[a-z].*)(?=.*[A-Z].*)(?=.*[!#\$%&\?].*).{8,}

但似乎无法弄清楚如何让第一个数字与数字不匹配,并将特殊字符类设置为不匹配。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:4)

我发现将其分解为单独的测试是:

  • 更容易编码
  • 更易于阅读
  • 更易于维护
  • 在需求变更时更灵活

尝试这样的事情:

var testPassword = function (password) {
    var minLengthMet = password.length >= 8,
        hasUpper = (/[A-Z]+/).test(password),
        hasLower = (/[a-z]+/).test(password),
        hasNumber = (/[0-9]+/).test(password),
        letterBegin = (/^[A-Za-z]/).test(password),
        noSpecials = !(/[^A-Za-z0-9]+/).test(password);
    return minLengthMet && hasUpper && hasLower && hasNumber && letterBegin && noSpecials;
};

在此处查看此操作: http://jsfiddle.net/H9twa/

答案 1 :(得分:3)

以下是我要采用的内容:

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?!.*[!#\$%&\?])^\D.{7}

请注意,每个前瞻术语后的.*都是多余的。

(?!...)是一个负面的预测,以确保没有特殊字符。

^\D要求第一个字符为非数字。然后我只需要7个字符,因为结尾没有强制执行。

但为什么要从密码中排除特殊字符?通常情况恰恰相反。

答案 2 :(得分:3)

怎么样:

pwd.length >= 8 &&
pwd.match(/[A-Z]/) &&
pwd.match(/[a-z]/) &&
pwd.match(/\d/) &&
!pwd.match(/^\d/) &&
!pwd.match(/[!#\$%&\?]/);

以防您需要维护此代码吗?