2012-01-24 41 views
0

我試圖用火柴()函數來對某些條件的Java String.matches()的正則表達式

「包含六個字母數字字符,至少一個字母和一個數字」

檢查用戶輸入的密碼

這裏是我的檢查字母數字字符使用「rrrrZZ1」

pword.matches("([[a-zA-Z]&&0-9])*")

不幸例如作爲密碼當前條件此條件仍然返回false

什麼是正確的正則表達式?謝謝

+0

嘗試[A-ZA-Z0-9] { 6,}。 –

回答

5

這裏的其他人可能會證明我錯了,但如果沒有過於複雜的正則表達式,這將會非常困難。我只是使用非正則表達式方法。爲每個條件設置3個布爾值,在每個條件滿足時遍歷字符並設置每個布爾值,如果所有3個布爾值不等於true,則驗證失敗。

你可以用這樣簡單的東西:

public boolean validatePassword(String password){ 
    if(password.length() < 6){ 
     return false; 
    } 
    boolean foundLetter = false; 
    boolean foundNumber = false; 
    for(int i=0; i < password.length(); i++){ 
     char c = password.charAt(i); 
     if(Character.isLetter(c)){ 
      foundLetter = true; 
     }else if(Character.isDigit(c)){ 
      foundNumber = true; 
     }else{ 
      // Isn't alpha-numeric. 
      return false; 
     } 
    } 
    return foundLetter && foundNumber; 
} 
+0

'matches'函數使用布爾值,我認爲我對匹配布爾邏輯的理解是錯誤的。它非常接近。 *字符循環檢查每個條件 – CQM

+0

@CQM - 否,「*」字符與前一個表達式匹配0次或更多次。 (可能完全不是你想要的。) – ziesemer

+0

這工作謝謝你! – CQM

2

我ziesemer同意 - 使用的,而不是填鴨式成正則表達式一個validatePassword()方法。

開發人員維護的可讀性要高得多。

如果您確實想要沿着正則表達式路徑走,可以使用零寬度正向預覽來實現。

包含六個字符,至少一個字母和一個數字:

^.*(?=.{6,})(?=.*[a-zA-Z]).*$ 

我改變你的六alphanumeric characters只是characters。 支持更復雜的密碼:)

大後的題目

http://www.zorched.net/2009/05/08/password-strength-validation-with-regular-expressions/

收藏這一個了:

http://www.regular-expressions.info/

+0

我猜'validatePassword()'方法也會比正常表達式模式要編譯的更好。 :-)如果一個正則表達式真的可以正常工作,那麼它可以作爲一個可替換的屬性使用 - I.E.將所需的模式作爲一個正則表達式存儲在屬性文件中。我只是不確定這將是多麼有用的密碼驗證規則。 – ziesemer

+0

方法()的另一個好處是,如果找到了肯定的結果,它可以提前離開。使用正則表達式,每次都會編譯和匹配整個模式。例如。如果你必須有一個len> 6的通行證,並且你給了它5個字符,你可以在一次簡單的長度檢查之後保釋,比正則表達式編譯要快得多 –