【问题标题】:Allowing more then one special chars in password在密码中允许多个特殊字符
【发布时间】:2013-01-23 02:10:11
【问题描述】:

我有正则表达式,可以测试以下规则,

  1. 密码必须至少有一个字符。
  2. 密码必须至少有一个数字。
  3. 密码必须至少包含一个字母数字字符。(应允许多于一个)

我的尝试是这样的,

/^([a-zA-Z+]+[0-9+]+[!@#$%^&*])$/

这在大多数情况下都可以正常工作,除非我添加多个字母数字字符。

测试

  • 测试 [qwer1234] 结果 [无效] 结论 [通过]
  • 测试 [qwer1234$] 结果 [有效] 结论 [通过]
  • 测试 [qwer1234#$] 结果 [无效] 结论 [失败]

最后一个测试应该通过但它失败了。我知道哪里出了问题,但无法掌握正则表达式的魔力。我对问题的看法是,

[0-9+] // This + sign shows that you can have more then 1 of that range of numerics

在哪里,

[!@#$%^&*] // Does not have the + sign

我试过了,

[!@#$%^&*+] // Does not have the + sign
[!@#$%^&*]+ // Does not have the + sign

两者都不起作用。我错过了什么?

【问题讨论】:

  • 是否有任何合法理由你必须将所有这些都塞进一个正则表达式中?
  • 我对你的解释感到困惑。密码的各个部分是否必须按照您指定的顺序出现?就像,它必须是(字母字符)(数字)(特殊字符),还是可以是每个至少 1 个的任意组合?我也很困惑为什么你在[ ]里面有+...
  • 如果它们必须按这个顺序排列,那么您应该使用:/^([a-zA-Z]+[0-9]+[!@#$%^&*]+)$/。将+ 放在[ ] 之外意味着匹配集合中的至少1 个字符。所以至少你可以有类似a2&的东西。将+ 放在[ ] 内意味着匹配+ 字符。所以从技术上讲,你可以在你的正则表达式中输入密码++* 并且它会通过。我认为它不应该...
  • 如果您不需要订购,请尝试类似:/(?=[^a-zA-Z]*[a-zA-Z])(?=[^0-9]*[0-9])(?=[^!@#$%^&*]*[!@#$%^&*])/,它只需要密码中的每个至少 1 个。 jsfiddle.net/bJTTk/1

标签: javascript regex validation passwords


【解决方案1】:

根据您的实际需要,根据您对您的情况的混乱描述,这里有两个正则表达式,希望对您有所帮助。第一个要求密码至少以 1 个字母字符开头,其次至少有 1 个数字字符,最后至少有 1 个特殊字符。

/^([a-zA-Z]+[0-9]+[!@#$%^&*]+)$/

http://jsfiddle.net/ECwP8/

如果您不要求字符按特定顺序出现,您可以试试这个正则表达式:

/(?=[^a-zA-Z]*[a-zA-Z])(?=[^0-9]*[0-9])(?=[^!@#$%^&*]*[!@#$%^&*])/

http://jsfiddle.net/bJTTk/1/

这只是要求密码中至少有 1 个字母字符、至少 1 个数字字符和至少 1 个特殊字符,以任意顺序出现。

【讨论】:

    【解决方案2】:

    为什么需要将所有内容混合到一个正则表达式中?

    function test_password(password) {
        if (password.length < 2) return false;            // Minimum length
        if (!/[0-9]/g.test(password)) return false;       // Needs a number
        if (!/[a-z]/gi.test(password)) return false;      // Needs a letter
        if (!/[^a-z0-9]/gi.test(password)) return false;  // Needs a special char
    
        return true;
    }
    

    【讨论】:

      【解决方案3】:

      试试下面的。如果一个字符应该是第一个,数字应该是第二个,字母数字应该是下一个,它将起作用。

      /^[a-zA-Z]+[1-9]+[!@#$%^&*]+$/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多