高效敏感词过滤应使用trie树实现,支持中文、最长匹配、内存可控;插入逐字符建节点并标记词尾,匹配时滑动延伸记录最远isend位置,替换为固定星号后跳过已处理字符;词库启动时加载,支持热更新;封装为工具类或集成校验注解。

Java 字符串敏感词过滤要实现高效替换,关键不是靠正则或循环遍历,而是用合适的数据结构把“查得快、替得准、改得轻”三个目标统一起来。Trie 树(前缀树)是初级到中型项目最实用的选择,它天然适配中文、支持最长匹配、内存可控、代码量少。
用 Trie 树构建可复用的过滤节点
Trie 节点只需两个核心字段:子节点映射(Map
- 插入时逐字符向下创建节点,走到末尾设 isEnd = true
- 中文无需额外处理——char 类型原生支持 UTF-8 中文字符,直接遍历 text.toCharArray() 即可
- 避免用 String.substring() 切片匹配,防止创建大量临时字符串对象
按字符滑动 + 最长匹配,避免误伤和漏判
单纯找到就替,容易把“苹果手机”里的“苹果”错杀。正确做法是从位置 i 开始,持续向右延伸,在 Trie 中同步下探,记录每次遇到 isEnd == true 的位置。最终取最远的那个作为本次匹配结果。
- 匹配成功后,用固定长度星号(如 "***")替换整段,不泄露原词长度
- 替换完立即跳过已匹配字符数,继续从下一个未扫描位置开始,不重叠、不遗漏
- 若某次下探中途断链(子节点为空),说明以 i 起始无敏感词,i 自增继续
启动加载词库,避免运行时 IO 拖慢响应
敏感词一般变动不频繁,没必要每次请求都读文件或查数据库。推荐在 Spring Boot 启动时一次性加载:
- 词库存为 resources/sensitive-words.txt,每行一个词,纯文本无格式
- 工具类加 @PostConstruct,服务启动即构建 Trie 树并驻留内存
- 后续如需热更新,只需加个 FileWatcher 监听文件变化,触发 reload 方法即可
最小侵入集成,Controller 或校验层都能调
封装成 @Component 工具类,提供清晰接口:
- filter(String text):返回已替换文本;contains(String text):仅判断是否存在
- Controller 层接收参数后直接调用,不污染业务逻辑
- 需要全局拦截(如昵称、评论)时,配合 @Valid + 自定义注解 + ConstraintValidator,把过滤下沉到参数校验环节
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











