使用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个
  • $
    :结束

您的密码是否也有长度要求?@anubhava但这也不能肯定是否存在一个符号字符。[此处]()您可以查看有关模式匹配的更多信息。所有东西都应该用大括号括起来,比如
((?=.[a-z])(?=.{1}[!@$%^&*(?+=?~])
,但是你给出的是这样的
(?=.[a-z])(?=.{1}[!@$%^&*(?+=?])
,没有外部大括号。@anubhava,这是完美的解决方案。@anubhava。我真的很感谢你的帮助。如果你把它作为答案贴出来,我可以接受。@Mandy8055:谢谢。就性能而言,负字符类
[^a-z]*
将是最快的。请检查我下面的答案。您的密码是否也有长度要求?@anubhava,但这也不能肯定是否存在一个符号字符。[此处]()您可以查看有关模式匹配的更多信息。所有东西都应该用大括号括起来,比如
((?=.[a-z])(?=.{1}[!@$%^&*(?+=?~])
,但是你给出的是这样的
(?=.[a-z])(?=.{1}[!@$%^&*(?+=?])
,没有外部大括号。@anubhava,这是完美的解决方案。@anubhava。我真的很感谢你的帮助。如果你把它作为答案贴出来,我可以接受。@Mandy8055:谢谢。就性能而言,负字符类
[^a-z]*
将是最快的。请检查我下面的答案。