Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java正则表达式验证字符串_Java_Regex - Fatal编程技术网

Java正则表达式验证字符串

Java正则表达式验证字符串,java,regex,Java,Regex,关于正则表达式有很多类似的问题,但我仍然对以下情况感到困惑: import java.util.regex.Pattern; public class PatternTest { public static void main(String[] args) { String PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,20})"; Pattern pattern = Pattern.compile(

关于正则表达式有很多类似的问题,但我仍然对以下情况感到困惑:

import java.util.regex.Pattern;

public class PatternTest {

  public static void main(String[] args) {
    String PATTERN = "((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,20})";
    Pattern pattern = Pattern.compile(PATTERN);

    boolean isTrue = pattern.matcher("nks#n1Kos2~([{&").matches();

    System.out.println(isTrue);
  }

}
~([{&
的字符不在模式中,但是
匹配的
显示为
true
。这是什么原因

下面是Java正则表达式测试仪上的链接,
(?=X)
模式是“零宽度正向前瞻”断言。因此,它们断言在搜索字符串中找到正则表达式而不使用任何正则表达式。所有这些断言都成功传递

{8,20}
模式表示“只要有8到20个字符(包括8到20个字符),就匹配任何字符”。因此它匹配整个字符串。
(?=X)
模式是“零宽度正向前瞻”断言。所以他们断言在搜索字符串中找到正则表达式,而不使用任何正则表达式。所有这些断言都成功传递

{8,20}
模式表示“只要有8到20个字符(包括8到20个),就匹配任何字符”。因此它匹配整个字符串。

您的正则表达式是:

String PATTERN = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,20}";
这意味着匹配长度为8到20的任何字符,该字符满足前瞻中给出的所有条件

你真正需要的是:

String PATTERN = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%])[a-zA-Z\\d@#$%]{8,20}";
[a-zA-Z\\d@$%{8,20}
将只匹配
[…]
8到20中允许的字符长度。

您的正则表达式是:

String PATTERN = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{8,20}";
这意味着匹配长度为8到20的任何字符,该字符满足前瞻中给出的所有条件

你真正需要的是:

String PATTERN = "(?=.*\\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%])[a-zA-Z\\d@#$%]{8,20}";

[a-zA-Z\\d@#$%{8,20}
将只匹配
[…]中允许的字符长度为8到20。

[a-zA-Z\\d@#$%]
可以工作,但是它需要再次列出所有字符,这有点笨拙。
[a-zA-Z\\d@$]
可以工作,但是它有点笨拙,因为它需要再次列出所有字符。为了帮助消除混淆,当
{8,20}
匹配时,是吗?限制密码的字符集是不明智的。黑客猜测,当
{8,20}时,组合是可以帮助消除混淆的
match,是吗?限制密码的字符集是不明智的。黑客猜测,组合是可行的