使用Java正则表达式进行密码验证失败
我的要求包括验证密码输入是否只包含以下字符之一一次。!@$%^&*()?+=~ 为此,我写了以下内容:使用Java正则表达式进行密码验证失败,java,regex,Java,Regex,我的要求包括验证密码输入是否只包含以下字符之一一次。!@$%^&*()?+=~ 为此,我写了以下内容: StringBuilder builder = new StringBuilder("(?=.*[a-z])"); builder.append("(?=.{1}[!@#$%^&*()_+=?~])"); Pattern pattern = Pattern.compile(builder.toString()); Matcher matcher = pattern.matcher(i
StringBuilder builder = new StringBuilder("(?=.*[a-z])");
builder.append("(?=.{1}[!@#$%^&*()_+=?~])");
Pattern pattern = Pattern.compile(builder.toString());
Matcher matcher = pattern.matcher(input);
if(matcher.matches){
return True;
}
但当我通过单元测试中的有效输入时,这总是失败。我对regex不熟悉 您可以将此正则表达式与两个先行断言一起使用:
^(?=[^a-z]*[a-z])(?=[^!@#$%^&*()_+=?~]*[!@#$%^&*()_+=?~][^!@#$%^&*()_+=?~]*$).{12,}$
请注意,在.matches()
方法中,开始和结束锚点自动隐含在给定的正则表达式中
正则表达式详细信息:
:开始^
:正向前瞻以确保我们至少有一个小写字母(?=[^a-z]*[a-z])
:积极地向前看,确保我们只有一个给定的特殊字符(?=[^!@!#$%^&*()u+=?~]*[!@$%^&*()u+=?~][^!@#$%^&*()u+=?~]*)
:匹配任何字符的最小12个{12,}
:结束$
^(?=[^a-z]*[a-z])(?=[^!@#$%^&*()_+=?~]*[!@#$%^&*()_+=?~][^!@#$%^&*()_+=?~]*$).{12,}$
请注意,在.matches()
方法中,开始和结束锚点自动隐含在给定的正则表达式中
正则表达式详细信息:
:开始^
:正向前瞻以确保我们至少有一个小写字母(?=[^a-z]*[a-z])
:积极地向前看,确保我们只有一个给定的特殊字符(?=[^!@!#$%^&*()u+=?~]*[!@$%^&*()u+=?~][^!@#$%^&*()u+=?~]*)
:匹配任何字符的最小12个{12,}
:结束$
((?=.[a-z])(?=.{1}[!@$%^&*(?+=?~])
,但是你给出的是这样的(?=.[a-z])(?=.{1}[!@$%^&*(?+=?])
,没有外部大括号。@anubhava,这是完美的解决方案。@anubhava。我真的很感谢你的帮助。如果你把它作为答案贴出来,我可以接受。@Mandy8055:谢谢。就性能而言,负字符类[^a-z]*
将是最快的。请检查我下面的答案。您的密码是否也有长度要求?@anubhava,但这也不能肯定是否存在一个符号字符。[此处]()您可以查看有关模式匹配的更多信息。所有东西都应该用大括号括起来,比如((?=.[a-z])(?=.{1}[!@$%^&*(?+=?~])
,但是你给出的是这样的(?=.[a-z])(?=.{1}[!@$%^&*(?+=?])
,没有外部大括号。@anubhava,这是完美的解决方案。@anubhava。我真的很感谢你的帮助。如果你把它作为答案贴出来,我可以接受。@Mandy8055:谢谢。就性能而言,负字符类[^a-z]*
将是最快的。请检查我下面的答案。