无法让Matcher.replaceAll正常工作

时间:2013-03-24 21:10:14

标签: java regex

我在模式替换方面遇到了一些奇怪的问题。

我有这两种模式:

private static final Pattern CODE_ANY = Pattern.compile("&[0-9a-fk-or]");
private static final Pattern CODE_BLACK = Pattern.compile(ChatColour.BLACK.toString());

ChatColour.BLACK.toString()返回“& 0”

接下来,我有这段代码:

public static String Strip(String message)
{
    while (true)
    {
        Matcher matcher = CODE_ANY.matcher(message);
        if (!matcher.matches())
            break;
        message = matcher.replaceAll("");
    }
    return message;
}

我尝试了几种不同的方法,但没有任何东西被取代。 初始版本一个接一个地调用每个CODE_xxx模式,但是用户通过将&符号加倍来绕过它。

我只是不明白为什么这不会删除任何东西.. 我知道它肯定会被调用,因为我已经将调试消息打印到控制台以检查它。

// Morten

1 个答案:

答案 0 :(得分:4)

matches()检查完整的输入字符串是否匹配模式,而find()检查模式是否可以找到输入字符串中的某个位置。因此,我会将您的方法重写为:

public static String strip(String message) // lowercase strip due to Java naming conventions
{
    Matcher matcher = CODE_ANY.matcher(message);
    if (matcher.find())
        message = matcher.replaceAll("");
    return message;
}

刚才意识到,这可以通过一个班轮完成:

public static String strip(String message) {
    return message.replaceAll("&[0-9a-fk-or]", "");
}

使用replaceAll()方法,您不需要预编译模式,但可以将正则表达式提取到String类型的最终字段。