Pattern和Matcher在java中不起作用

时间:2016-11-09 11:29:47

标签: java regex

基本上我有一个简单的字符串我需要明确限制a-zA-Z0-9以外的字符。在我提到错误之前,我是怎么做的。

Pattern p = Pattern.compile("[&=]");
Matcher m = p.matcher("Nothing is wrong");
if (m.find()){
    out.print("You are not allowed to have &=.");
    return;
}

Pattern p1 = Pattern.compile("[a-zA-Z0-9]");
Matcher m1 = p1.matcher("Itissupposetobeworking");
if (m1.find()){
    out.print("There is something wrong.");
    return;
}

第一个工作正常,但在第二个匹配器m1上总是执行if(m1.find()),即使它不包含模式中指定的任何字符。

我也试过Pattern p1 = Pattern.compile("[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]")但仍有同样的麻烦。

如果你想告诉我,String.matches(["a-zA-Z0-9"]);或我上面使用的方式哪个更好?

提前致谢。

4 个答案:

答案 0 :(得分:2)

[a-zA-Z0-9]尝试匹配字母数字字符。

所以,你会得到“有什么不对劲。”如果您在matcher()的输入字符序列中有字母数字字符,则要打印。

将其更改为[^a-zA-Z0-9]并尝试。

这会尝试匹配非字母数字字符。所以,你会得到预期的结果。

答案 1 :(得分:1)

您似乎想要在包含字母数字字符以外的字符的字符串中找到部分匹配:

Pattern p1 = Pattern.compile("[^a-zA-Z0-9]");

Pattern p1 = Pattern.compile("\\P{Alnum}");

[^a-zA-Z0-9]模式是一个否定的字符类,它匹配除类中定义的字符之外的任何字符。因此,如果一个字符串包含除ASCII字母或数字之外的任何字符,您的if (m1.find())将被触发并显示该消息。

请注意,整个否定字符类可以替换为与字母数字以外的任何字符匹配的预定义字符类\P{Alnum}\p{Alnum}匹配任何字母数字字符,\P{Alnum}是反向类。

答案 2 :(得分:1)

当上面的表达式找到匹配时,它会打印出“有错误”。但如果您想限制,请使用以下代码。

    Pattern p1 = Pattern.compile("a-zA-Z0-9");
    String a = "It$issupposetobeworking";
    Matcher m1 = p1.matcher(a);
    if (m1.find()){
        System.out.print("There is something wrong.");
    }
    else
    {
        System.out.println("Everything is fine");
    }

如果您希望相同的代码在该场景中使用相同的正则表达式,请使用此代码。

    Pattern p1 = Pattern.compile("[a-zA-Z0-9]");
    Matcher m1 = p1.matcher("Itissupposetobeworking");
    if (!(m1.find())){
           out.print("There is something wrong.");
            return;
     }

答案 3 :(得分:0)

如果使用org.apache.commons.lang.StringUtils的isAlphanumeric方法,则代码变得更具可读性。所以你需要写

if (!StringUtils.isAlphanumeric("Itissupposetobeworking"))

而不是

Pattern p1 = Pattern.compile("[a-zA-Z0-9]");
Matcher m1 = p1.matcher("Itissupposetobeworking");
if (!m1.find()){
相关问题