В вашей версии проверочное утверждение только проверяет, может ли оно соответствовать строке длиной 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)"