【问题标题】:need a regex for password validation that allows all special characters [duplicate]需要一个允许所有特殊字符的密码验证正则表达式[重复]
【发布时间】:2014-08-18 00:24:44
【问题描述】:

密码要求是:

  • 至少两个字母
  • 至少两个数字
  • 至少一个特殊字符(任何特殊字符)
  • 至少 8 个字符

这个很接近但不工作: /^(?=.*\d)(?=.*[a-zA-Z])(?=.*[\W]).{8,}$/

我做错了什么?

【问题讨论】:

  • 为此使用正则表达式
  • 你想要上面的 OR 吗?
  • 字母和字符有什么区别?
  • @AvinashRaj,字母是 a-z。字符是任何东西,包括数字、标点符号和其他特殊字符。
  • 这个字母不代表大写A-Z吗?

标签: javascript regex validation passwords


【解决方案1】:

我会说:

/^(?=.*\d.*\d)(?=.*[a-zA-Z].*[a-zA-Z])(?=.*[\W]).{8,}$/

您的正则表达式缺少 2 个数字和 2 个字母的要求。

【讨论】:

  • 仅供参考,除了所有回溯之外,该正则表达式不验证abcd_1234,这是一个有效的密码。 :)
  • 这是因为_ 被认为是\w 中的单词字符。一种选择是在类中添加,另一种是使用[^A-Za-z0-9]
  • 是的,我知道为什么...我只是指出问题所在。
【解决方案2】:

一个正则表达式可能不适合这个;很难看一眼您拥有的正则表达式并立即了解需求是什么,更不用说如何修改它们了。您可能只想直接计算每个组中的字符数,然后检查这些计数是否都通过了适当的阈值。

也就是说:考虑到这会强制使用非常尴尬的密码,但不允许使用xkcd-style passwords。我强烈建议您采用更具启发性的方法,较长的密码可以放松其他限制。强制使用强密码还有其他考虑因素,例如与字典单词的相似性和 唯一 个字符的数量。

老实说,您最好只需要密码:)

【讨论】:

    【解决方案3】:

    怎么样:

    /^(?=.{2,}\d)(?=.{2,}[a-zA-Z])(?=.*[\W]).{8,}$/
    

    应该满足你的要求。

    【讨论】:

    • 不。这表示从第 3 位开始应该有 1 个数字,从第 3 位开始应该有 1 个字母,一个特殊字符,至少 8 个字符。
    • 失败:12aaaaaaa?和 aa1234567?
    【解决方案4】:

    取决于您认为什么是“特殊字符”。如果特殊字符不是数字或字母,并且密码中不允许使用空格,则:

    ^(?=(?:\S*\d){2})(?=(?:\S*[A-Za-z]){2})(?=\S*[^A-Za-z0-9])\S{8,}
    

    或者,使用“转义符”:

    "^(?=(?:\\S*\\d){2})(?=(?:\\S*[A-Za-z]){2})(?=\\S*[^A-Za-z0-9])\\S{8,}"
    

    如果您选择允许空格,请将 \S 替换为点。

    如果您想将“特殊字符”定义为仅包括某些字符,或者排除除字母和数字之外的其他字符,请在最后的前瞻中编辑字符类。

    【讨论】:

      【解决方案5】:

      此正则表达式符合您的要求:

      /^(?=(?:[^a-z]*[a-z]){2})(?=(?:[^0-9]*[0-9]){2})(?=.*[!-\/:-@\[-`{-~]).{8,}$/i
      

      the demo 一起玩,看看哪些匹配,哪些不匹配。

      说明

      • 这是一种经典的密码验证技术,如this article 中所述,具有环视功能
      • 末尾的i 标志使其不区分大小写,因此我们不必说a-zA-Z
      • ^ 锚断言我们位于字符串的开头
      • 第一个前瞻(?=(?:[^a-z]*[a-z]){2}) 断言在此位置(字符串的开头)后面是任何不是字母的字符,后跟一个字母......两次,确保至少有两个字母李>
      • 第二个前瞻(?=(?:[^0-9]*[0-9]){2}) 断言在这个位置(仍然是字符串的开头)后面是任何不是数字的字符,后跟一个数字......两次,确保至少有两个字母
      • 第三个前瞻 (?=.*[!-\/:-@\[-{-~])` 断言在这个位置(仍然是字符串的开头)后面是任何字符,后跟一个特殊字符
      • $ 锚断言我们在字符串的末尾

      特殊字符注意事项

      正则表达式[!-\/:-@\[-{-~]` 专门从the ASCII table 中挑选出所有既不是数字也不是字母的可打印字符。如果这包含您不想要的字符,请使其更具限制性。

      【讨论】:

      • 嗯。我不使用它,但我在文档中没有看到 javascript 支持模式修饰符
      • @RonRosenfeld 它有效。 JS 不支持内联修饰符,比如(?i),这就是为什么我把它放在模式之后,在/i
      • 感谢您的课程。我现在明白你的意思了。
      猜你喜欢
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 2016-10-30
      相关资源
      最近更新 更多