java - Java 编码审查词
问题描述
我正在开发一个用 Java 编码的 Spigot 插件,并希望审查玩家聊天消息。我尝试使用 #replaceAll() 对其进行审查,但它审查的内容超出了应有的范围
我的代码是(使用的示例词)
public static String filter(String message) {
return message.replaceAll("(?i)on", "**");
}
输出是“打开它”->“打开它**”
但它也取代了“我做过一次”->“我做过 **ce”
有没有更好的方法可以将其替换为正确的星星,但如果它在单词中,则不会得到它。
此外,如果他们尝试使用“on”或“on”绕过它可能会阻止它,我尝试忽略空格,但如果他们键入两个实际单词,例如“to no”,其中将包含“on”而没有空格,则会触发。
解决方案
\b
您可以使用以下标志将正则表达式更改为仅匹配单词边界:
text.replaceAll("\\bon\\b", "**");
(您需要一个额外的反斜杠来转义反斜杠,否则 Java 会将其视为特殊字符(可能是退格))。
也就是说,使用正则表达式总是会给你带来糟糕的结果,因为你的正则表达式不理解上下文。自然语言处理库(请参阅您选择的搜索引擎)将更难使用,但会获得更好的结果。
推荐阅读
- for-loop - 如果我将 golang 中的增量相乘,则 For 循环不会递增
- r - 使用 3 列创建唯一 ID 时出现内存大小错误
- http - 保持对 lua 中 websocket 库的支持
- python - 仅当过去 4 小时内没有重复项时才插入表中
- python - 从 Tensorflow 中的张量中随机选择唯一(不重复)元素
- c# - 带有等待的每个循环的任务工厂
- java - 如何在android的主要活动中声明另一个活动的按钮?
- asp.net-core-mvc - 从 .Net Core Web Application (MVC),WebAPI in Same solution 返回 404
- authentication - 微服务认证架构
- php - 如何减轻 REQUEST_URI 的依赖于服务器的行为以使用它来抑制特定的短代码