2012-01-15 2 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)" 
Смежные вопросы