2014-03-07 493 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

相關問題