转义序列无效\ d

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

我正在尝试这个:

if(!password.matches("(?=.*\d)(?=.*[az])(?=.*[AZ])(?=.*[@#$%^&+=])")){ username = "Error"; } 

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

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

谢谢,惠特\\ d不做错误,但它与像保罗%88这样的字符串不匹配为什么?

Java会将字符串中的\视为启动转义序列 。 确保你使用\\代替(以便你在字符串中得到一个真正的\字符),你应该没问题。

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

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

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

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

这是整个正则表达式:

 (?=.*\d)(?=.*[az])(?=.*[AZ])(?=.*[@#$%^&+=]).* 

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