Неверная escape-последовательность\d
Я пытаюсь проверить, содержит ли пароль хотя бы одну строчную букву, одну букву верхнего регистра, одну цифру и один специальный символ.
Я пытаюсь это сделать:
if(!password.matches("(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])")){
username = "Error";
}
но сообщите мне об ошибке: неверная escape-последовательность.
Кто-то может помочь мне решить проблему и подтвердить, что это правильный шаблон?
Спасибо, whit\\d не делает ошибку, но не соответствует строке, например Paul% 88, почему?
Ответы
Ответ 1
Java будет обрабатывать \
внутри строки, начиная с escape-последовательности. Убедитесь, что вместо этого вы используете \\
(чтобы вы получили фактический символ \
в строке), и вы должны быть в порядке.
Быстрое обновление. Как указывает Этьен, если вы действительно хотите \
в самом RegEx, вам нужно использовать \\\\
, так как это приведет к созданию \\
в строка, которая будет производить \
в RegEx.
Новое обновление вопроса:. Вы отмечаете, что ваш RegEx не работает, и я уверен, что это неправильно. Если вы просто хотите, чтобы один из классов типа символов присутствовал, вы можете просто создать один RegEx для каждого класса, а затем проверить пароль по каждому из них. Пароли в значительной степени гарантированы быть короткими (и вы можете фактически контролировать это самостоятельно), поэтому перфоманс должен быть минимальным.
Ответ 2
Я использовал это, чтобы быстро протестировать его: http://www.regexplanet.com/simple/index.html
Похоже, он работает, если вы положили. * в конце. Думаю, вам нужно включить и регулярное выражение без внешнего вида.
Вот полное регулярное выражение:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*
Конечно, в вашем Java-коде вы должны избегать обратной косой черты, как уже упоминалось.