Проверка пароля в регулярных выражениях добавить подчеркивание как специальный символ

#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();
}
 

Чтобы затем создать различные классы, реализующие такой интерфейс. И, наконец, вы просто создаете один объект для каждого класса реализации; и вы можете поместить их в некоторый статический список. А затем проверка означает: просто запустите все объекты валидатора в этом списке. При сбое вы можете напрямую запросить сообщение об ошибке для пользователя (чтобы вы могли точно указать ему, чего не хватает; вместо того, чтобы снова набрасывать на него весь набор правил).

Не говорю, что что-то подобное требуется всегда, но по моему опыту: правила паролей могут часто меняться. Жесткая обработка их в регулярных выражениях редко является надежным подходом.