Валидация пароля 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");
}
Чтобы понять как работает этот шаблон, гугли:
- Что такое набор символов в регулярных выражениях
- Как инвертировать набор символов
- Слияние диапазонов символов