我需要一个正则表达式来满足密码复杂性定义。我在正则表达方面没有太多经验,所以如果有人可以为我设计解释,我将不胜感激。
密码必须包含四个选项中的至少3种类型的字符(一个大写,一个小写,数字,特殊字符),并且不应该有相同的连续字符超过两次。例如," Sahash11"是正确的,但" Sahash111"是不正确的。
答案 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