我试图验证一个只允许字母,数字和这些字符的字符串:
!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
我尝试过这样做,但它不起作用,允许我输入不在正则表达式中的字符。我仍然是java的新手,类似的东西在javascript工作,但我无法弄清楚这里发生了什么。我认为它的运行就好像它找不到任何提到的字符那么它将返回四个。
Pattern allowedCharacters = Pattern.compile("[A-Za-z0-9!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-]+$]");
if (!allowedCharacters.matcher(pw).find()){
return 4;
}
感谢任何帮助。感谢
编辑:
我也尝试过:
if (pw.matches("^[A-Za-z0-9!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-]+$]")){
return 4;
}
和
if (!pw.matches("[A-Za-z0-9!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-]+$]")){
return 4;
}
答案 0 :(得分:2)
matcher.find()
检查字符串是否包含与正则表达式匹配的子字符串,因此使用
!matcher.find()
您正在检查测试字符串中的正则表达式是否匹配。
考虑使用matcher.matches()
来检查整个字符串是否与正则表达式匹配。在这种情况下,您必须向字符类添加*
,+
或{n,m}
等量词来决定密码长度。否则它只会是单个字符密码。
以下是代码的外观演示
// here you place quantifier
// ↓
if (pw.matches("[A-Za-z0-9!\"#$%&'()*+,.\\/:;<=>?@[\\]^_`{|}~-]+$]+")){
System.out.println("password contains only valid characters");
} else {
System.out.println("invalid characters in password");
}
<强>更新强>
在你的正则表达式中,你没有转义[
,这使得[\]^_`{|}~-]
单独的字符类将被添加到外部字符类。此字符类不会包含\
或[
。如果您真的对仅接受字母数字字符和!"#$%&'()*+,-./:;<=>?@[]^_`{|}~
感兴趣,请考虑使用
"[\\w\\Q!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\\E]+"
作为正则表达式。
\\w
代表[a-zA-Z0-9_]
\Q
和\E
是引用,即使在字符类中也是逃避元字符的机制。答案 1 :(得分:1)
这是因为您使用的是find()
而不是matches()
。也就是说,我会尝试相反的做法,在[^<legal chars>]
(请注意插入符号)上找到匹配非法字符的内容。它更快,因为它会在遇到违法行为时立即失败。此外,从简单的法律字符开始,然后从那里向上移动。正则表达式可能难以阅读,并且一次添加一个具有特殊含义的字符比一次添加它们更容易。
答案 2 :(得分:0)
使用此问题的其他答案,我发现这对我有用。 \ Q和\ E之间无需转义任何内容。他们为你做到了。
Pattern whitelist = Pattern.compile("^[\\w\\s\\Q!\"#$%&'()*+,-.\\/:;<=>?@[]^_`{|}~\\E]+$");
if (!whitelist.matcher(pw).matches()) {
// error
}