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,是吗?限制密码的字符集是不明智的。黑客猜测,组合是可行的