2014-03-07 287 views
1

我对密码通配性有一系列要求,我是解决问题的一部分,但在某些特定领域遇到了麻烦。当前表达式我有如下:密码的正则表达式 - 不包含开头,不包含

^(?=(.*\d){2,4})(?=(.*[A-Z]))(?=(.*[a-z])).{8}$ 

该表达式(据我所知,并已测试)将需要一个包含至少一个大写字母,小写字母,并在8个字符的密码至少两个电话号码,但不超过4

剩余的需求我想实现如下: - 含有至少3个不同的字母 - 不是以数字开头 - 不能包含特殊字符 - 不从三个相同的字符开始(即aaa,ccc)。

我将不胜感激关于这些的任何帮助或指导。

+0

〔罗马密码的复杂性,蝙蝠侠](http://xkcd.com/936/) – admdrew

+2

如果你这样做作为一个“正则表达式练习”,否则,正确的做法是使用具有不同测试的'validate()'方法检查所有需求。将来阅读和维护会更容易(如果您决定将其更改为需求)。 – alfasin

+1

另外,给出这个庞大的限制列表的可能的密码集......在一定程度上是有限的。 – Tetrinity

回答

1

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 
+0

是\ Pp本来是\ pP? – user3153407

+1

@ user3153407 - 修正,应该是\ PP,即:不标点 – sln

相关问题