验证字符串没有非法字符

时间:2014-02-21 18:37:41

标签: java regex

我试图验证一个只允许字母,数字和这些字符的字符串:

!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~

我尝试过这样做,但它不起作用,允许我输入不在正则表达式中的字符。我仍然是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;
}

3 个答案:

答案 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
}