我正在尝试检查密码是否包含至少一个小写字母,一个大写字母,一个数字和一个特殊字符。
我正在尝试这个:
if(!password.matches("(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%^&+=])")){
username = "Error";
}
但是给我一个错误说:无效的转义序列。
有人可以帮助我解决问题并确认这是正确的模式吗?
谢谢,whit \\ d不做错误但是它与Paul%88之类的字符串不匹配为什么?
答案 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代码中,你必须转义已经提到的反斜杠。