为复杂的密码定义建议正则表达式

时间:2015-01-29 09:21:59

标签: regex

我需要一个正则表达式来满足密码复杂性定义。我在正则表达方面没有太多经验,所以如果有人可以为我设计解释,我将不胜感激。

密码必须包含四个选项中的至少3种类型的字符(一个大写,一个小写,数字,特殊字符),并且不应该有相同的连续字符超过两次。例如," Sahash11"是正确的,但" Sahash111"是不正确的。

1 个答案:

答案 0 :(得分:1)

应该能够使用支持条件的引擎来实现 很容易,例如,30个中的14个。只需添加更多结构
对于交替,然后将量词设置为您需要的数量。

示例(?:.*?(?:this|that|a|b|c|9)){3}需要3个中的6个 (注意,必须在与组相关的每个交替中插入条件)

延迟补充说明 您始终可以在量词中设置范围 上面(?:.*?(?:this|that|a|b|c|9)){3,6}的示例需要3个中的3个 这样做可以进行一些有用的匹配后分析。

例如,如果要测试密码的强度 在比赛结束后,你可以检查每个捕获组的匹配,然后是 增加一个力量计数器。

喜欢:

int strength = 0;
for (int i=1; i<=6; i++)
if ( match[i].success )
     strength++;

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

 (?m)                        # Multi-line modifier (remove if a single line string
 ^                           # Beginning of string
 (?!                         # Not 3 consecutive same char's
      .*? 
      ( . )                       # (1)
      \1 \1 
 )
 (?:
      .*?     
      (?>                         # Atomic group
           (                           # (2 start), Upper case
                (?(2)                       # Exclude from matching again
                     (?!)
                )
                [A-Z]+ 
           )                           # (2 end)
        |  (                           # (3 start), Lower case
                (?(3)                       # Exclude from matching again
                     (?!)
                )
                [a-z]+ 
           )                           # (3 end)
        |  (                           # (4 start), Number
                (?(4)                       # Exclude from matching again
                     (?!)
                )
                [0-9]+ 
           )                           # (4 end)
        |  (                           # (5 start), Special char's (add to the class)
                (?(5)                       # Exclude from matching again
                     (?!)
                )
                [!@#$%^&*()\[\]_+}{?><,./":;'-]+ 
           )                           # (5 end)
      )
 ){3}                        # Match 3 out of 4
 .* 
 $                           # End of string