无效的转义序列 \d

2022-09-03 03:55:19

我正在尝试检查密码是否包含至少一个小写字母,一个大写字母,一个数字和一个特殊字符。

我正在尝试这个:

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

但是给我一个错误说:无效的转义序列。

有人可以帮我解决问题,并可以确认这是一个正确的模式?

谢谢,没有做错误,但它与像Paul%88这样的字符串不匹配,为什么?


答案 1

Java 会将字符串内部视为启动转义序列。确保你使用代替(这样你就可以在字符串中得到一个实际的字符),你应该没问题。\\\\

快速更新:正如Etienne所指出的,如果您真的想要正则表达式本身中的一个,则需要使用 ,因为它将在字符串中产生,这将在正则表达式中产生。\\\\\\\\

新问题更新:你提到你的正则表达式不起作用,我很确定这是因为它是错误的。如果您只想确保每种类型的字符类都存在一个,则可能只想为每个类创建一个正则表达式,然后检查每个正则表达式的密码。密码几乎可以保证很短(您实际上可以自己控制它),因此perf命中应该最小。


答案 2

我用它来快速测试它:http://www.regexplanet.com/simple/index.html

看起来如果你把.*放在最后,它的工作原理。我想你还需要包含一个非前瞻正则表达式。

这是整个正则表达式:

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

当然,在java代码中,您必须如前所述转义反斜杠。