我在模式替换方面遇到了一些奇怪的问题。
我有这两种模式:
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
答案 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类型的最终字段。