2012-01-15 92 views
1

我對創建複雜RegEx並不太擅長。我複製從另一個源以下,爲了一定程度的密碼限制強制實施的應用程序:正則表達式字符長度限制失敗單元測試

// 8 to 20 char, one digit, one letter 
public static final String GOOD_PASSWORD_REGEX = 
    "(^(?=.{8,20})(?=.*[a-zA-Z])(?=.*[\\d]).*$)"; 

同時,該單元測試失敗:

String tooLongPassword = "asdfghjkl123456789qwe"; // 21 characters 
assertFalse(tooLongPassword.matches(ValidationContants.GOOD_PASSWORD_REGEX)); 

這是類似少數之一我正在針對此RegEx運行測試用例,其中包括沒有字母,數字等的其他測試用例,其餘所有通過。

請問哪裏出錯?

回答

1

在您的版本中,lookahead斷言僅檢查它是否可以匹配字符串開始處的8-20個字符長度的字符串。這當然也成功了一串長度爲21以上的字符串。

所以$需要成爲先行的一部分:

// 8 to 20 char, one digit, one letter 
public static final String GOOD_PASSWORD_REGEX = 
    "(^(?=.{8,20}$)(?=.*[a-zA-Z])(?=.*\\d).*$)"; 

但是,爲什麼在密碼強加的長度最大?另外[]快捷方式\d附近是不必要的。

而且,因爲你只需要在正則表達式來驗證密碼,而不是實際返回它(因爲它的成立,現在它會返回整個輸入字符串的方式),可以縮短正則表達式:

"^(?=.{8,20}$)(?=.*[a-zA-Z])(?=.*\\d)"