代码之家  ›  专栏  ›  技术社区  ›  Woot4Moo

用于检查大于1的上、下、数字和特殊字符的正则表达式

  •  1
  • Woot4Moo  · 技术社区  · 14 年前

    ^。 ?= { 15,})(?= d)(?)=。 [AZ])?=。 [AZ])?= [!@ +=)

    这是我目前正在使用的正则表达式,它将对每个正则表达式中的一个进行求值:上、下、数字和我选择的特殊值。我的问题是如何检查每一个的2个?另外,我问这个问题是因为似乎很难为此编写一个测试用例,因为我不知道它是否只评估它需要的第一组标准。这是一个密码,但是要求它必须是基于我们使用的包的regex格式。

    编辑

    由于我急于验证表达式,所以忘记验证字符串长度。感谢肯和阿甘帮了我。

    这是我正在执行的代码:

    很抱歉,regex不是我的地盘。

    我使用的密码是下面的字符串“$$qiouwer1245”,我目前所经历的行为是它随机选择通过或失败。有什么想法吗?

    Pattern pattern = Pattern.compile(regEx);
    Matcher match = pattern.matcher(password);  
    while(match.find()){
        System.out.println(match.group()); 
    }
    

    从我看,如果它的计算结果是真的,它将把password中的值返回给我,否则它是一个空字符串。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Gumbo    14 年前

    试试这个:

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

    这里是非捕获组 (?:…) 用于分组条件并重复这些条件。我还使用了每个字符类的补码来进行优化,而不是通用的 .

        2
  •  3
  •   Kimball Robinson    14 年前

    就我个人而言,我认为强制使用所有三个字符类的密码策略并不是很有帮助。通过让人们制作更长的密码,可以获得相同程度的随机性。如果用户必须遵守太多的密码规则(这会使密码难以记住),他们往往会感到沮丧并记下密码。我建议计算熵的位,并确保它们大于60(通常需要10-14个字符的密码)。每个字符的熵大致取决于字符的数量、它们使用的字符集的范围,以及它们在字符集之间切换的频率(我猜像Heythere这样的密码比Heythere更容易预测)。

    另一个注意事项:您是否计划不计算键盘右侧的符号(句点、逗号、尖括号等)?

    如果你还需要找到两个字符的组,为什么不重复每个模式呢?例如,使= d)进入(?)= \D**D)。

    对于您的测试用例,如果您担心它只检查第一个条件,那么编写一个测试用例,确保以下每个密码都失败(因为在每个情况下都不满足其中一个条件):为了好玩,我颠倒了每个字符的期望顺序ET,不过除非有人把它移走/忘记,否则它可能不会有什么区别?=在未来某个日期。

    !@#TESTwithoutnumbers
    TESTwithoutsymbols123
    &*(testwithoutuppercase456
    +_^TESTWITHOUTLOWERCASE3498
    

    我应该指出,从技术上讲,这些密码都不应该被接受,因为它们使用字典中的单词,每个字符的熵大约为2位,而不是6位。然而,我意识到编写一个(可维护且高效的)正则表达式来检查字典单词是很困难的。

        3
  •  2
  •   Ken Aspeslagh    14 年前

    如果我正确理解您的问题,您至少需要15个字符,并且需要至少2个大写字符、至少2个小写字符、至少2个数字和至少2个特殊字符。那样的话你可以这样做:

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

    顺便说一下,原来的regex在

        4
  •  1
  •   a'r    14 年前

    我不确定一个大的正则表达式是正确的方式来这里。这看起来已经太复杂了,将来很难改变。

    我的建议是按以下方式构建代码:

    • 检查字符串是否有两个小写字符
      • 如果找不到返回失败或继续
    • 检查字符串是否有两个大写字符
      • 如果找不到返回失败或继续
    • 等。

    这还允许您传递一个返回代码或错误字符串,指定不接受密码的原因,代码将简单得多。