#java #regex
#java #регулярное выражение
Вопрос:
Пароль должен содержать: 1 верхнюю букву 1 нижнюю букву 1 цифру 1 специальный символ Минимум 8 символов
Вот мое регулярное выражение:
^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@_$%^amp;*-]).{8,}$
Но когда я пытаюсь проверить, например, с помощью пароля: Test_123, он возвращает меня false
вот мой код :
public class PasswordCheck {
static Logger logger = Logger.getLogger(CommonHelper.class);
private static final String PASSWORD_PATTERN = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@_$%^amp;*-]).{8,}$";
private Pattern pattern;
private Matcher matcher;
public PasswordCheck() {
pattern = Pattern.compile(PASSWORD_PATTERN);
}
/**
* Validate password with regular expression
*
* @param password
* password for validation
* @return true valid password, false invalid password
*/
public boolean validate(final String password) {
matcher = pattern.matcher(password);
System.out.println(password);
System.out.println(matcher.matches());
return matcher.matches();
}
}
Я просто пытаюсь установить новую строку в функции validate с тем же текстом: Test_1523 и возвращает мне true, но когда я отправляю эту строку через службу rest и передаю ее функции, возвращает мне false
Комментарии:
1. Я проверяю regexr.com и регулярное выражение все в порядке, пожалуйста, не могли бы вы опубликовать свой код?
2. Вы установили модификатор без учета регистра?
3. Добавьте точку останова в строке «matcher = pattern.matcher (password);» внутри метода проверки и посмотрите, каково значение параметра «пароль». Я просто хочу проверить, содержит ли он какой-либо другой символ.
4. Я углубился и понял, что проблема заключается не в регулярном выражении, а в строке, поступающей из службы rest. До сих пор не знаю, почему, но когда я форматирую его так: byte bytes[] = pass.getBytes(«ISO-8859-1»); Строка CheckPassword = новая строка (байты, «UTF-8»); if (passCheck.validate(CheckPassword)) { Он начинает работать правильно.
Ответ №1:
Неважно, используете ли вы регулярные выражения или другие средства для проверки этих строк, но, пожалуйста: не помещайте все в один фрагмент кода или регулярное выражение.
Вы хотите создать код, который легко читать и поддерживать; и одно регулярное выражение, содержащее так много «закодированных» знаний, не поможет в этом. Я не раз использовал что-то вроде
interface PasswordValidator {
boolean isValid(String input);
String getErrorMessage();
}
Чтобы затем создать различные классы, реализующие такой интерфейс. И, наконец, вы просто создаете один объект для каждого класса реализации; и вы можете поместить их в некоторый статический список. А затем проверка означает: просто запустите все объекты валидатора в этом списке. При сбое вы можете напрямую запросить сообщение об ошибке для пользователя (чтобы вы могли точно указать ему, чего не хватает; вместо того, чтобы снова набрасывать на него весь набор правил).
Не говорю, что что-то подобное требуется всегда, но по моему опыту: правила паролей могут часто меняться. Жесткая обработка их в регулярных выражениях редко является надежным подходом.