需要一个正则表达式进行密码验证,允许所有特殊字符

时间:2014-06-27 01:09:05

标签: javascript regex validation passwords

密码要求是:

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

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

我做错了什么?

5 个答案:

答案 0 :(得分:3)

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

/^(?=(?:[^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的字母。如果这包括您不想要的字符,请使其更具限制性。

答案 1 :(得分:2)

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

这就是说:考虑到这会强制执行真正尴尬的密码,但却禁止xkcd-style passwords。我强烈建议您采用更具启发性的方法,其中较长的密码会放宽其他限制。执行强密码还有其他注意事项,例如与字典单词的相似性和唯一字符的数量。

老实说,你可能最好只需要密码短语:)

答案 2 :(得分:1)

我说:

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

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

答案 3 :(得分:0)

怎么样:

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

它应该符合你的要求。

答案 4 :(得分:0)

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

^(?=(?:\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.

如果要将“特殊字符”定义为仅包含某些字符,或者除了字母和数字之外还要排除其他字符,请在最后一个前瞻中编辑字符类。