2012-07-06 62 views
1

我使用java和一個正則表達式。正則表達式的密碼

我做了密碼驗證一個正則表達式:

String PASSWORD_PATTERN_ADVANCED = "^(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+]).{8,20}$"; 

或沒有額外的斜線:

^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°"\]\[²³*/+]).{8,20}$ 

whuch手段(我可能是錯的):至少一個數字/至少一個小寫/至少一個大寫字母/至少一個特殊字符/最小總長度爲8,最大長度爲20 ...

做了一個測試用例,爲成功生成密碼失敗...

成功 - > OK,全部通過 失敗 - >幾乎OK ......

失敗失敗的唯一密碼:d是在它的空間的像:

iF\ !h6 2A3|Gm 
¨I O7 gZ2%L£k vd~39 
2< A Uw a7kEw6,6S^ 
cC2c5N# 
6L kIw~ Béj7]5 
ynRZ #44ç 
9A `sè53Laj A 
s²R[µ3 9UrR q8n 

我很困惑。

任何想法,使其工作?

感謝

+0

以防萬一..你檢查過http://stackoverflow.com/q/3200292/1007273? – hovanessyan 2012-07-06 14:40:58

+0

@hovanessyan好!這裏是直接鏈接[link](http://code.google.com/p/vt-middleware/wiki/vtpassword)。我一定會在未來的開發中使用它。 – 2012-07-09 14:13:57

回答

1

正則表達式可能不是這裏工作的正確工具。

正則表達式最適合匹配模式;你所描述的本質上不是一種模式,它更像是一個規則集。當然,你可以創建一些有用的正則表達式,但這是一個非常複雜和不透明的代碼,這使得維護成爲一個挑戰。

像這樣的方法可能是更好的選擇:

public boolean isValidPassword(String password) { 
    boolean containsLowerCase; 
    boolean containsUpperCase; 
    boolean containsInvalid; 
    boolean containsSpecialChar; 
    boolean containsDigit; 

    for(char c: password.toCharArray()) { 
     containsLowerCase ||= Character.isLowerCase(c); 
     containsUpperCase ||= Character.isUpperCase(c); 
     containsDigit  ||= Character.isDigit(c); 
     containsSpecialChar ||= someMethodForDetectingIfItIsSpecial(c); 

    } 

    return containsLowerCase && 
      containsUpperCase && 
      containsSpecialChar && 
      containsDigit && 
      !containsInvalid && 
      password.length >=8 && password.length <=20; 

} 

你需要決定檢出特殊字符(specialCharArray.contains(c),正則表達式等)的最佳方法。

但是,這種方法會使添加新規則變得簡單得多。

+0

我跟隨的好建議。非常感謝。 – 2012-07-09 14:14:40

0

沒有你的條件,說明什麼不能是密碼,只有什麼必須。您還需要一個條件來組合所有可能的有效字符,並確保密碼中的所有字符都在該列表中(即最終條件爲(\d|[a-z]|[A-Z]|@#$...){8,20})。要麼是被拒絕的字符列表。

1

我可能是錯的,但是如果你根本不想使用空格,那麼在你的lookahead中使用[^\\s]而不是.

String PASSWORD_PATTERN_ADVANCED = 
     "^(?=[^\\s]*\\d)" 
     + "(?=[^\\s]*[a-z])" 
     + "(?=[^\\s]*[A-Z])" 
     + "(?=[^\\s]*[\\\\@#$¤£µ§%&<>,.!:?;~{-|`'_^¨éèçàù)=}()°\"\\]\\[²³*/+])" 
     + ".{8,20}$";