Подтвердить что ты не робот

Неверная escape-последовательность\d

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

Я пытаюсь это сделать:

if(!password.matches("(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])")){
        username = "Error";
    }

но сообщите мне об ошибке: неверная escape-последовательность.

Кто-то может помочь мне решить проблему и подтвердить, что это правильный шаблон?

Спасибо, whit\\d не делает ошибку, но не соответствует строке, например Paul% 88, почему?

4b9b3361

Ответ 1

Java будет обрабатывать \ внутри строки, начиная с escape-последовательности. Убедитесь, что вместо этого вы используете \\ (чтобы вы получили фактический символ \ в строке), и вы должны быть в порядке.

Быстрое обновление. Как указывает Этьен, если вы действительно хотите \ в самом RegEx, вам нужно использовать \\\\, так как это приведет к созданию \\ в строка, которая будет производить \ в RegEx.

Новое обновление вопроса:. Вы отмечаете, что ваш RegEx не работает, и я уверен, что это неправильно. Если вы просто хотите, чтобы один из классов типа символов присутствовал, вы можете просто создать один RegEx для каждого класса, а затем проверить пароль по каждому из них. Пароли в значительной степени гарантированы быть короткими (и вы можете фактически контролировать это самостоятельно), поэтому перфоманс должен быть минимальным.

Ответ 2

Я использовал это, чтобы быстро протестировать его: http://www.regexplanet.com/simple/index.html

Похоже, он работает, если вы положили. * в конце. Думаю, вам нужно включить и регулярное выражение без внешнего вида.

Вот полное регулярное выражение:

(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*

Конечно, в вашем Java-коде вы должны избегать обратной косой черты, как уже упоминалось.