2012-01-15 3 views
1

복잡한 RegEx를 만드는 데별로 좋지 않습니다.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)" 
: 당신은 단지 암호의 유효성을 검사하는 정규식을 필요로하기 때문에

또한, 실제로 그것을 돌려 (지금은 전체 입력 문자열을 반환합니다 설정 년대 방식 때문에), 당신은에 정규식을 단축 할 수

관련 문제