Предел длины символа в RegEx не проходит модульный тест - PullRequest
1 голос
/ 15 января 2012

Я не очень хорош в создании комплекса 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 Ответ

1 голос
/ 15 января 2012

В вашей версии проверочное утверждение только проверяет, может ли оно соответствовать строке длиной 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)"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...