转义序列无效\ d

时间:2011-07-15 14:43:37

标签: java regex

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

我正在尝试这个:

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

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

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

谢谢,whit \\ d不做错误但是它与Paul%88之类的字符串不匹配为什么?

2 个答案:

答案 0 :(得分:38)

Java会将字符串中的\视为开始escape sequence。请确保使用\\代替(以便在字符串中获得实际的\字符)并且您应该没问题。

快速更新:正如Etienne所指出的,如果您真的想在RegEx本身中使用\,则需要使用\\\\,因为这会产生{字符串中的{1}},将在RegEx中生成\\

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

答案 1 :(得分:2)

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

如果你把。*放在最后,它看起来很有用。我想你还需要实际包含一个非前瞻性的正则表达式。

以下是整个正则表达式:

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

当然,在你的java代码中,你必须转义已经提到的反斜杠。