我正在开发一个用Java编写的Spigot插件,并希望检查玩家的聊天消息。我尝试使用#replaceAll()对其进行审查,但它对审查的次数超过了应该
我的代码是(使用了示例单词)
public static String filter(String message) {
return message.replaceAll("(?i)on", "**");
}
输出是 “打开”->“打开**”
但它也替代 “我做过一次”->“我做过** ce”
是否有更好的方法可以将其替换为正确的星星,但如果单词正确,则无法获取。
如果他们尝试绕过使用,也可以阻止它 我尝试忽略“ o n”或“ o.n”,但是如果他们键入两个实际的单词(例如“ to no”),其中包含不带空格的“ on”,则会触发空格。
答案 0 :(得分:2)
您可以使用\b
标志将正则表达式更改为例如仅匹配单词边界:
text.replaceAll("\\bon\\b", "**");
(您需要一个额外的反斜杠来转义反斜杠,否则Java会将其视为特殊字符(可能是空格))。
也就是说,使用正则表达式总是会给您带来糟糕的结果,因为您的正则表达式无法理解上下文。自然语言处理库(请参见您选择的搜索引擎)将更难使用,但可获得更好的结果。