【问题标题】:HTML5 Pattern Regex Password MatchHTML5 模式正则表达式密码匹配
【发布时间】:2013-06-03 20:21:42
【问题描述】:

寻求一些帮助来验证以下规则的密码:

8+ 个字符

至少包含 1 个大写字母

至少包含 1 个小写字母

至少包含 1 个数字

不能以数字开头

不包含特殊字符

我已经做到了:

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

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

【问题讨论】:

  • 只是备注,为了更好的密码安全性,允许一些特殊字符可能会很好,以使可能性范围尽可能广泛
  • 我们的 ERP 系统不允许使用特殊字符。

标签: javascript regex


【解决方案1】:

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

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

试试这样的:

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/

【讨论】:

  • 好主意!只是注意:[A-Za-z]\w 相同,[0-9]\d 相同,[^A-Za-z0-9] 可能是[^\w\d]
  • @JanTuroň,这不是 100% 正确的 Jan。\w 还包括下划线。 \w 与 [A-Za-z0-9_] 相同
  • @JanTuroň:他们不一样。 \w[A-Za-z0-9_] 相同。您对\d 的看法是正确的。就我个人而言,我更喜欢字符类而不是速记,因为我发现它们更容易阅读。
【解决方案2】:

怎么样:

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

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

【讨论】:

  • 几乎没有任何容易维护并且需要更多时间来运行。正则表达式解决方案非常简单,如果人们不理解正则表达式,那么他们仍然无法获得传递给 match 方法的值。我知道好的干净代码很重要,但对于不理解它的人来说,愚蠢的语法似乎有点过头了。就像用英文写一本书,以便法国人可以阅读。
【解决方案3】:

这就是我想要的:

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

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

(?!...) 是一个否定的前瞻,以确保没有特殊字符。

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

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

【讨论】:

  • 尽管我很佩服对复杂正则表达式的掌握,但如果我在我正在处理的代码中发现类似的东西,我会寻找作者并向他们发送一封措辞强硬的投诉信。
  • @MatthewGilliard,要点。通常最好将其分解为多个步骤。但是,如果代码库使用大量正则表达式并且每个人都熟悉它们(并且带有注释的文档很好),我认为这并不是那么复杂。
猜你喜欢
  • 2017-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
相关资源
最近更新 更多