Валидация пароля Regex

Не могу написать код используя regex. Всё перепробовал. Надо, чтобы можно было использовать a-z A-Z 0-9 и только. Самое главное, чтобы не было пробела в пароле.

   if (entity.getPassword().matches(".*\\S.*")) {
        throw new ValidationException("Password cannot contain whitespace");
    }

    if (entity.getPassword().matches("\\w")) {
        throw new ValidationException("Password can contain only a-z A-Z 0-9");
    }

Ответы (2 шт):

Автор решения: Nowhere Man

Для проверки на наличие пробельных символов нужно использовать класс \s, а не противоположный \S:

if (entity.getPassword().matches(".*\\s.*")) {
    throw new ValidationException("Password cannot contain whitespace");
}

Впрочем, эта проверка лишняя, если в пароле разрешены только буквы/цифры. Также стоит добавить проверку на минимальную длину пароля.

if (!entity.getPassword().matches("[a-zA-Z0-9]{6,}")) {
    throw new ValidationException("Password can contain only a-z A-Z 0-9");
}

Можно также добавить требования, чтобы были как минимум одна прописная, одна строчная, одна цифра:

if (!entity.getPassword().matches("(?=.*[A-Z])(?=.*[a-z])(?=.*\\d)[A-Za-z\\d]{6,}")) {
    throw new ValidationException("Password has to contain at least one capital letter, one small letter, one digit with the minimal length of 6");
}
→ Ссылка
Автор решения: Bakuard

Проще пойти от обратного:

if(password.matches("[^a-zA-Z\\d]")) {
    throw new ValidationException("Password can contains only a-z A-Z 0-9 without whitespace");
}

Чтобы понять как работает этот шаблон, гугли:

  1. Что такое набор символов в регулярных выражениях
  2. Как инвертировать набор символов
  3. Слияние диапазонов символов
→ Ссылка