2010-09-26 92 views
2

我有regex.This密碼驗證是我的表達:密碼強 - 不要求每個條件

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$ 

它的工作原理 - 至少密碼必須包含至少1個數字,至少1小寫字母, 1個大寫字母和至少特殊字符:@#$%^&+=。所以我必須輸入所有這些字符。

但我想密碼,其中有至少3人組合,不是所有的4
那麼這些密碼應該是不錯的:

2Df(沒有特殊字符),dF#(不是數字),a4%(不是大寫)。我想問一下,這個正則表達式應該如何看待?我可以寫每個表達式來檢查每個組合,例如:

  • 不包括位數:^(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*$
  • 不包括大寫:^(?=.*\d)(?=.*[a-z])(?=.*[@#$%^&+=]).*$

但也許我可以用一個表達做到這一點。

+0

你在做什麼語言? – 2010-09-26 13:52:23

回答

1

如果您需要做的它與正則表達式,我建議(爲了清晰起見)檢查所有四個條件彼此。爲了便於閱讀,您可以首先嚐試在您的密碼中找到\d,然後[a-z],然後[A-Z],然後[@#$%^&+=](儘管您可能想用[\W_]代替允許不僅僅是這些少數多餘字符)。然後檢查是否至少有三個工作。

如果做到在一個單一的正則表達式,你可以使用交替:

^((?=.*[a-z])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[A-Z])(?=.*[\W_])|(?=.*[\W_])(?=.*[A-Z])(?=.*\d)|(?=.*[a-z])(?=.*[\W_])(?=.*\d)).*$ 

但是,這只是醜陋。

3

爲什麼你使用正則表達式呢?只需遍歷密碼字符串並計算所需字符類型的數量即可。在PHP中,你可以使用像count_chars()這樣的函數。對於

僞代碼:

 foreach(password as char) { 
     if (is_digit(char)) 
      digits++; 
     if (is_specialchar(char)) 
      special++; 
     if (is_lower(char)) 
      lower++; 
     if (is_upper(char)) 
      upper++; 
     //etc 
     } 

現在你可以定義你想

 if (dgits > 0) and (lower > 0) and (special > 0) 
     passowrd_ok() 
     else 
     password_bad() 
你的情況

任何要求,你可以巧妙地算

 if (lower > 0) 
     diversity++; 
    if (upper > 0) 
     diversity++; 
    if (special > 0) 
     diversity++; 
    if (digit > 0) 
     diversity++; 

    if (diversity >= 3) //at least 3 different types of characters in password 
     pass_ok() 
+0

感謝您的回答。我必須在ASP(不是.NET)站點驗證密碼 - 所以我認爲,最好的解決方案是正則表達式。 – luk4443 2010-09-26 14:06:41

+1

@ luk4443:爲什麼地獄?你可以遍歷VB,C#或其他任何字符串。在VB中,循環是'For i = 0 To s.Length-1',並且可以通過s.Chars(i)或者Mid(s,i,1)' – doc 2010-09-26 14:15:53

+0

來訪問每個字符。好的,謝謝,我會測試。 – luk4443 2010-09-26 14:18:07