4

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

8+ 个字符

至少包含 1 个大写字母

至少包含 1 个小写字母

至少包含 1 个数字

不能以数字开头

不包含特殊字符

我已经做到了:

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

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

4

3 回答 3

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/

于 2013-06-07T14:00:41.880 回答
3

怎么样:

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

以防万一您需要维护此代码?

于 2013-06-07T14:00:34.897 回答
3

这是我会去的:

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

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

(?!...)是负前瞻,以确保没有特殊字符。

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

但是为什么要从密码中排除特殊字符呢?通常鼓励相反。

于 2013-06-07T13:45:36.053 回答