无效的转义序列\d

16
我想检查一个密码是否至少包含一个小写字母、一个大写字母、一个数字和一个特殊字符。
我正在尝试这样做:
if(!password.matches("(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])")){
        username = "Error";
    }

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

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

谢谢,使用\\d没有错误,但它不能匹配像Paul%88这样的字符串,为什么?


2
尝试将 \d 替换为 \d - Asad Rasheed
你尝试过用\d替换\d吗?(又晚了一步!) - mikey
我建议仔细测试每个特殊字符。它们在正则表达式中可能具有特殊含义,需要进行转义处理。 - Sarel Botha
2个回答

41

Java会将字符串中的\解释为开始一个转义序列。请确保使用\\代替(这样您就可以在字符串中获得实际的\字符),这样就没问题了。

快速更新:正如Etienne所指出的,如果你实际上想要在RegEx本身中使用\,你需要使用\\\\,因为这将在字符串中产生\\,这将在RegEx中产生\

新问题更新: 你提到你的正则表达式不可行,我很确定那是因为它是错误的。如果您只想确保每个类型的字符类别都存在一个,则可能只需为每个类别创建一个RegEx,然后根据每个RegEx检查密码。密码基本上可以保证很短(您实际上可以自己控制),因此性能损失应该很小。


3
实际上,在 Java 正则表达式中的任何转义序列都表示双反斜杠,这样 Java 就可以用单个反斜杠替换它们,然后正则表达式解析器可以将反斜杠及其后面的字符替换为其所代表的实际含义。 - user684934
这意味着,在Java正则表达式中,要实际获取\字符,您必须编写\\。 - Etienne de Martel
现在不会报错,但也无法匹配像Paul%88这样的字符串。 - Matteo
1
这个网站对我帮助很大。你可以从提交的正则表达式中获取Java字符串。http://www.regexplanet.com/advanced/java/index.html - LeFex

2
我用这个快速测试了一下:http://www.regexplanet.com/simple/index.html 看起来如果在末尾加上 .* 就可以工作了。我想你也需要包含一个非前瞻正则表达式。
这是整个正则表达式:
(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=]).*

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

这不匹配是因为没有一个捕获组匹配,但是末尾的 .* 表示“匹配任何东西”? - dlev
不,我测试过了,它需要所有这些字符才能匹配。我认为如果您不包括任何非环视组,则就像提供了一个空的正则表达式,如果您的字符串不为空,则不会匹配。 - Sarel Botha
你是对的。我测试了一个我认为不应该匹配但实际上匹配的字符串;事实上,它本应该匹配。 - dlev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接