1

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

我有这两种模式:

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 模式,但用户通过加倍使用 & 符号来绕过它。

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

// 莫顿

4

1 回答 1

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 类型的最终字段。

于 2013-03-24T21:18:02.713 回答