首页 > 解决方案 > Java 编码审查词

问题描述

我正在开发一个用 Java 编码的 Spigot 插件,并希望审查玩家聊天消息。我尝试使用 #replaceAll() 对其进行审查,但它审查的内容超出了应有的范围

我的代码是(使用的示例词)

public static String filter(String message) {
    return message.replaceAll("(?i)on", "**");
}

输出是“打开它”->“打开它**”

但它也取代了“我做过一次”->“我做过 **ce”

有没有更好的方法可以将其替换为正确的星星,但如果它在单词中,则不会得到它。

此外,如果他们尝试使用“on”或“on”绕过它可能会阻止它,我尝试忽略空格,但如果他们键入两个实际单词,例如“to no”,其中将包含“on”而没有空格,则会触发。

标签: javabukkit

解决方案


\b您可以使用以下标志将正则表达式更改为仅匹配单词边界:

text.replaceAll("\\bon\\b", "**");

(您需要一个额外的反斜杠来转义反斜杠,否则 Java 会将其视为特殊字符(可能是退格))。

也就是说,使用正则表达式总是会给你带来糟糕的结果,因为你的正则表达式不理解上下文。自然语言处理库(请参阅您选择的搜索引擎)将更难使用,但会获得更好的结果。


推荐阅读