This Works。
(注 - 建议您排除空白以及)
# ^(?=.{8}$)(?!\d)(?=\PP*$)(?=(.)(?!\1\1))(?=.*[A-Z])(?=.*[a-z])(?=(?:\D*\d){2,4}\D*$)(?=.*([a-zA-Z]).*(?!\2)([a-zA-Z]).*(?!\2|\3)[a-zA-Z]).*$
^ # BOS
(?= .{8} $) # 8 characters total
(?! \d) # Not start with digit
(?= \PP* $) # No Punct (special chars?)
(?= # Not start 3 identical chars
(.) # (1)
(?! \1 \1)
)
(?= .* [A-Z]) # At least 1 upper
(?= .* [a-z]) # At least 1 lower
(?= # At least 2 digits, no more than 4
(?: \D* \d){2,4}
\D* $
)
(?= # At least 3 different alpha chars
.*
([a-zA-Z]) # (2)
.*
(?! \2)
([a-zA-Z]) # (3)
.*
(?! \2 | \3)
[a-zA-Z]
)
.*
$ # EOS
推荐 - RegexFormat4读/维护的代码。
Perl的测试用例
if('~5bC$=6c' =~ /^(?=.{8}$)(?!\d)(?=\PP*$)(?=(.)(?!\1\1))(?=.*[A-Z])(?=.*[a-z])(?=(?:\D*\d){2,4}\D*$)(?=.*([a-zA-Z]).*(?!\2)([a-zA-Z]).*(?!\2|\3)[a-zA-Z]).*$/)
{
print "Matched $&\n";
}
输出>>
Matched ~5bC$=6c
来源
2014-03-07 16:11:22
sln
〔罗马密码的复杂性,蝙蝠侠](http://xkcd.com/936/) – admdrew
如果你这样做作为一个“正则表达式练习”,否则,正确的做法是使用具有不同测试的'validate()'方法检查所有需求。将来阅读和维护会更容易(如果您决定将其更改为需求)。 – alfasin
另外,给出这个庞大的限制列表的可能的密码集......在一定程度上是有限的。 – Tetrinity