【问题标题】:Regex to check password validation based on given conditions?正则表达式根据给定条件检查密码验证?
【发布时间】:2015-04-29 12:37:22
【问题描述】:

确保给定字符串与以下内容匹配的正则表达式是什么 条件?

  1. 最少八个字符。

  2. 应该是以下三项的组合:

        a. Upper case characters 
        b. Lower Case characters 
        c. Numbers 
        d. Special characters `(!@#$%^&*?/)`
    

我知道一个正则表达式,它可以帮助我检查字符串是否匹配 #2 下提到的所有点。但我想知道我们如何检查组合?

当前使用的正则表达式:

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

提前致谢

【问题讨论】:

标签: javascript regex validation passwords


【解决方案1】:

您想在前瞻中使用 .* 而不是 .

例如:(?=.*[a-z]) 而不是 (?=.[a-z])

说明

. 只匹配 any 字符中的 一个,因此目前,您的前瞻只检查 second 字符是否匹配 @987654328 @、[A-Z]\d[_|[!@#$%^&*?/]


但是不要这样做,因为即使您正确实施,这也是一个可怕的密码策略。

此类密码策略适用于不真正了解如何创建强密码的人。密码破解者不会以任何方式将大写字母或$ 视为“特殊”。强制执行这种事情只会使人类更难记住密码。让您的用户了解如何创建强密码对您来说会更好。

最好的密码是长密码。喜欢 16 个字符或更多。越长越好。

实现这一点也非常容易。不需要正则表达式!

if (password.length < 16) { /* too short! */ }

“通过 20 年的努力,我们成功地训练了每个人使用人类难以记住但计算机容易猜测的密码。”

如果你不相信,也许这部著名的漫画会有所帮助

(信用:http://xkcd.com/936/

【讨论】:

  • 感谢您的快速回复。我正在使用: ^(?=.*[az])(?=.*[AZ])(?=.*\d)(?=.*(_|[!@#$%^&*? /])).{8,}$ 现在。但它仍然不符合标准#2。如何检查组合?
  • 请查看我的帖子的编辑。我在道德上有义务引导您避免创建错误的密码策略。我不会再为正则表达式“解决方案”提供帮助了。
  • 感谢您的精彩帖子。但我需要根据公司政策对其进行验证:(
【解决方案2】:

你快到了,只是不要匹配正则表达式中的.(任何字符):

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

\w[a-zA-Z0-9_] 相同

【讨论】:

  • 谢谢。但它不符合#2。例如:Sh1dhgj9 给了我错误,我希望它按照给定的标准通过。我们如何检查组合?
  • @anubhava,帮新用户拍自己的脚是不负责任的。
  • @user1692773:Sh1dhgj9 没有您的问题中列出的任何特殊字符,如何被允许使用。
  • 如果特殊字符不是强制性的,那么使用这个正则表达式/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[\w!@#$%^&amp;*?/]{8,}$/gmAlso see this demo
【解决方案3】:

很遗憾,您使用的 JavaScript 不支持正则表达式条件。

在一个正则表达式中只有 2 种方法可以做到这一点。
1. 做 Y 的 X 上的所有排列
2. 使用支持条件的引擎。

因为 2. 对于 JavaScript 来说是不可能的,所以你只剩下 1.
当它超过订单 3 时我会感到困惑。

如果引擎支持条件,则可以这样做。
但它没有,所以忽略这个。

作为参考,如果您可以使用条件,那么 Y 中的任何 X 都可以轻松完成。
检查捕获组的输出匹配位置并注意如何
他们出了问题。

例子:

 #  ^(?:.*?(?:((?(1)(?!))[a-z]+)|((?(2)(?!))[A-Z]+)|((?(3)(?!))[0-9]+)|((?(4)(?!))[_!@#$%^&*?/]+))){3,4}.*$

 ^     
 (?:
      .*? 
      (?:
           (                        # (1)
                (?(1)
                     (?!)
                )
                [a-z]+ 
           )
        |  (                        # (2)
                (?(2)
                     (?!)
                )
                [A-Z]+ 
           )
        |  (                        # (3)
                (?(3)
                     (?!)
                )
                [0-9]+ 
           )
        |  (                        # (4)
                (?(4)
                     (?!)
                )
                [_!@#$%^&*?/]+ 
           )
      )
 ){3,4}
 .* 
 $

输出:

 **  Grp 0 -  ( pos 0 , len 15 ) 
B,B_+&*%#a0AaaP
 **  Grp 1 -  ( pos 9 , len 1 ) 
a
 **  Grp 2 -  ( pos 0 , len 1 ) 
B
 **  Grp 3 -  ( pos 10 , len 1 ) 
0
 **  Grp 4 -  ( pos 3 , len 1 ) 
_

【讨论】:

    猜你喜欢
    • 2016-10-30
    • 2011-05-06
    • 2016-10-19
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多