Set不能直接用于敏感词过滤,因其has()仅支持精确匹配而非子串查找;它适用于命中词去重、白名单校验和违禁词集合动态更新。

Set 本身不适合直接做敏感词过滤,但它能成为高效比对环节的有力辅助——关键在于明确分工:用 DFA 或正则做主匹配,用 Set 管理已确认的违禁词集合、去重结果或白名单反向校验。
不直接用 Set 做全文扫描匹配
敏感词过滤需要判断“输入文本中是否包含某个子串”,而 Set 的 has() 只能判断整个值是否精确存在。比如你有 Set(['枪', '枪支', '非法枪支']),调用 set.has('他买了枪') 永远返回 false。所以不能靠 Set 直接替代字符串查找逻辑。
Set 在敏感词系统中的三个高效用法
1. 快速查证已命中词汇(后处理去重与归类)
DFA 或正则匹配出一批命中词后,常出现重复(如“枪支”和“枪”在长句中被多次捕获),可用 Set 去重:
- const matched = new Set();
- matched.add('枪'); matched.add('枪支'); matched.add('枪'); // 自动去重
- console.log([...matched]); // ['枪', '枪支']
2. 白名单兜底校验(允许例外)
某些词虽在敏感词库中,但特定上下文可放行(如“苹果手机”里的“苹果”)。可预建白名单 Set,匹配后二次校验:
- const whitelist = new Set(['苹果', '小米', '华为']);
- if (isSensitive(word) && !whitelist.has(word.toLowerCase())) { /* 拦截 */ }
3. 动态维护违禁词热更新集合
从后端拉取最新敏感词列表时,用 Set 替代数组可加速后续存在性判断:
- let banned = new Set(await fetchBannedWords());
- // 后续任意位置只需:banned.has(inputWord)
- banned.add('新违禁词'); banned.delete('误报词');
真正高效的主过滤逻辑仍需其他方案
若你要构建健壮的敏感词系统,推荐组合使用:
- DFA 算法:适合固定词库、高频检测,时间复杂度接近 O(n),支持前缀共享和快速中断
-
正则动态构建:将敏感词转为
/(枪|枪支|非法枪支)/gi,注意防回溯爆炸(加边界、限制长度、用u标志支持 Unicode) - 分词+语义扩展:对“傻×”“傻*”等变体,先标准化再进 Set 或 DFA
Set 在其中不冲锋陷阵,但负责稳住后方:去重、缓存、授权、更新——轻量却不可替代。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











