【问题标题】:Regex match a strong password with two or more special characters正则表达式匹配具有两个或多个特殊字符的强密码
【发布时间】:2023-03-29 20:45:02
【问题描述】:

我需要使用具有以下要求的 javascript 正则表达式匹配密码字段:

  • 至少 15 个字符
  • 两个或多个小写字母
  • 两个或多个大写字母
  • 两位或多位数字
  • 以下两个或多个特殊字符:!@#$%^&*-

我有一个处理大多数情况的正则表达式:

/^.*(?=.{15,})(?=.{2,}\d)(?=.{2,}[a-z])(?=.{2,}[A-Z])(?=.{2,}[\!\@\#\$\%\^\&\*\-]).*$/

这里的问题在于符号,它适用于:

P@ssw0rdP@ssw0rd
Pssw0rdPssw0rd@@
Pssw0rd@@Pssw0rd

但不是:

@@Pssw0rdPssw0rd

我设置了一个随机密码生成器来对此进行详尽的测试,因此非常感谢任何想法。谢谢!

【问题讨论】:

  • 我认为这不能用 one 正则表达式来完成。
  • @Salman:为什么不呢?听说过前瞻吗?
  • 我建议不要这样做。在您的情况下,强制密码安全是用户创建“password1”或“PAssword!@12345”的主要原因之一。
  • @yorick 我认为如果用户强制执行密码安全性,他们可能会选择像p 这样的东西(我已经看到了)
  • 我更喜欢将各种条件分解为代码中的步骤,而不是通过一个复杂的正则表达式。这样您就可以向用户报告为什么他们的密码没有通过安全验证。也更容易验证它是否确实有效。

标签: javascript regex passwords


【解决方案1】:
/^(?=(?:.*[a-z]){2})(?=(?:.*[A-Z]){2})(?=(?:.*\d){2})(?=(?:.*[!@#$%^&*-]){2}).{15,}$/

你的前瞻是错误的。模式

(?=.{2,}[class])

表示匹配 2 个或多个字符(无论是什么字符),然后匹配所需类别的 1 个字符。这与您指定的“所需类别的 2 个或更多字符”完全不同。

要正确测试所需类别的字符是否在文本中,请使用

(?=.*[class])

既然你想检查两次,重复这个模式

(?=.*[class].*[class])
# equivalent to (?=(?:.*[class]){2})

【讨论】:

  • 使用 100,000 个随机创建的密码进行测试和确认。你先生是一个正则表达式绝地,谢谢!
  • 想补充一点,这个正则表达式适用于多平台,但如果你在 javascript 中使用它,由于 javascript 引擎中的前瞻问题,它在 IE7 中将不起作用。 link
  • 他们为什么不让你删除 cmets??
  • 这个答案的投票率很低。确实“您先生是正则表达式绝地,谢谢!” @kennytm
【解决方案2】:

我不确定单个正则表达式是否适合此测试。

我个人会这样实现它:(视为伪代码,我还没有测试过)

function testPassword(pw) {
    var len = pw.length;
    if(len < 15) return false;
    if(pw.replace(/[a-z]/,'').length > len - 2) return false;
    if(pw.replace(/[A-Z]/,'').length > len - 2) return false;
    if(pw.replace(/[0-9]/,'').length > len - 2) return false;
    if(pw.replace(/[!@#$%^&*-]/,'').length > len - 2) return false;
    return true;
}

【讨论】:

  • 我喜欢你的想法,但我需要正则表达式,因为它可以跨多种语言工作,所以更轻松的代码重用对我来说很关键。
【解决方案3】:

已经有一些很好的解释,所以我只是在堆积......

/^
(?= .{15} )
(?= (?:.*[[:lower:]]){2} )
(?= (?:.*[[:upper:]]){2} )
(?= (?:.*[[:digit:]]){2} )
(?= (?:.*[!@#$%^&amp;*-]){2} )
/x

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    相关资源
    最近更新 更多