2012-03-29 126 views
4

我需要執行以下的口令策略:正則表達式對密碼策略

至少9個字符,其中至少一個字符從各4 字符類(字母下和上殼體的;數字,符號)。

任何正則表達式的專家可以在這裏幫忙嗎? (我正在使用Java正則表達式引擎)

雖然我們在這裏,有沒有任何在線工具可以爲這些類型的任務生成正則表達式?

謝謝!

+5

學習正則表達式有什麼問題?國際海事組織,如果你想*避免*做/學習的東西,那麼你在錯誤的網站。 – 2012-03-29 08:46:32

+0

正則表達式的一個很好的參考是在http://www.vogella.de/articles/JavaRegularExpressions/article.html。請張貼你已經嘗試過的reg ex – 2012-03-29 08:47:05

+2

http://stackoverflow.com/questions/3387785/password-validation-regular-expression – cmbuckley 2012-03-29 08:47:07

回答

8
(?=.{9,})(?=.*?[^\w\s])(?=.*?[0-9])(?=.*?[A-Z]).*?[a-z].* 

注意,這種模式不包括像ö特殊字符UTF。我不會在一個正則表達式中這樣做。如果你想驗證它,我會分解它並搜索每個東西。

+0

工作過,謝謝! – Michael 2012-03-29 08:58:08

+0

如果你在JavaScript的土地和使用jQuery我建議jQuery驗證插件,這裏是一個強大的密碼的要點https://gist.github.com/mrgcohen/9806928 – 2014-03-27 12:56:37

+0

@mc如果您驗證數據只在js端的一個應用程序,你根本沒有安全。無論如何,服務器驗證都必須執行。 – Dariusz 2015-04-17 09:48:44

-1

這裏是產生正則表達式的在線工具:

http://regex.larsolavtorvik.com/

http://rubular.com/

+4

爲了避免誤解,這些工具不是用於*生成*表達式,而是用於*測試*它們。 – 2012-03-29 08:51:07

+0

是的,但可以通過跟蹤和錯誤生成表達式。它是測試/使用表達式並瞭解它們的好方法。但在技術上你是對的;) – pascalvgemert 2012-03-29 08:53:12

+0

正則表達式必須開發,「生成」他們的蹤跡和錯誤只是容易出錯。 – stema 2012-03-29 08:56:15

0

我會用多個正則表達式對解決這個問題:

9個字符 - 你可以正則表達式這一點,但。長度()> = 9時好多了!

對於角色職業,你應該使用一個公關類:

[a-z]+ 
[A-Z]+ 
[0-9]+ 
[£$%&{[...]+ //all the possible symbols you want to accept 
or perhaps: 
[:punct:]+ // this depends on your programming language.. 
or like in the suggestion by @david-halter: 
[^\w\s]+ // not alphanumeric or spaces 
5

這是我會怎麼做(使用正向前查找):

(?=.{9,})(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*\p{Punct}).* 

完整的示例和測試:

     // Regexp    Description 
Pattern p = Pattern.compile("(?=.{9,})" +  // "" followed by 9+ symbols 
          "(?=.*[a-z])" +  // --- ' ' --- at least 1 lower 
          "(?=.*[A-Z])" +  // --- ' ' --- at least 1 upper 
          "(?=.*[0-9])" +  // --- ' ' --- at least 1 digit 
          "(?=.*\\p{Punct})"+ // --- ' ' --- at least 1 symbol 
          ".*");    // the actual characters 
String[] tests = { 
     "aB99",   // too short 
     "abcdefghijk", // missing A 
     "abcdefGHIJK", // missing 5 
     "12345678910", // missing a 
     "abcDEF12345", // missing punct 
     "abcDEF-2345" // works! 
}; 

for (String s : tests) { 
    boolean matches = p.matcher(s).matches(); 
    System.out.printf("%-12s: %b%n", s, matches); 
} 

輸出:

aB99  : false 
abcdefghijk : false 
abcdefGHIJK : false 
12345678910 : false 
abcDEF12345 : false 
abcDEF-2345 : true 

最後再說一句:這種方法的問題是,它不是很人性化。如果您要對用戶作出明智迴應,例如「密碼缺少數字符號」,則需要再次執行該操作(以確定哪項要求失敗)。