如何通过正则表达式对西里尔字母单词的中间字符进行有效脱敏?
- 内容介绍
- 文章标签
- 相关推荐
本文共计825个文字,预计阅读时间需要4分钟。
相关专题:
本文介绍一种精准匹配俄文单词(含大小写及ё/Ё)中除首尾外所有字母的正则表达式方案,适用于敏感词过滤场景,配合 `string.replaceall()` 实现如“ОченьПлохоеСлово” → “О**************о”的自动星号脱敏。
在实现俄语敏感词过滤(如 swearword censoring)时,常见需求是保留单词首尾字母以维持可读性或上下文识别,同时将中间所有字符替换为星号 *。由于 JavaScript(及多数主流语言)中的 \w 默认仅匹配 ASCII 字母、数字和下划线,不包含西里尔字母,因此 /\B\w\B/g 等依赖 Unicode 类别或词边界(\b/\B)的模式在俄文文本中会失效。
正确的解决方案是使用环视断言(lookaround assertions)构建位置匹配逻辑:
- (?<=[а-яА-ЯёЁ]):正向后瞻(positive lookbehind),确保当前字符前面是一个西里尔字母;
- [а-яА-ЯёЁ]:匹配一个西里尔字母(覆盖小写 а–я、大写 А–Я,以及带分音符的 ё 和 Ё);
- (?=[а-яА-ЯёЁ]):正向前瞻(positive lookahead),确保当前字符后面也是一个西里尔字母。
三者组合 (?<=[а-яА-ЯёЁ])[а-яА-ЯёЁ](?=[а-яА-ЯёЁ]) 即精确匹配「位于两个西里尔字母之间的任意西里尔字母」——这天然排除了单词首字符(无前导西里尔字母)和末字符(无后续西里尔字母),完美满足需求。
✅ 使用示例(JavaScript)
const text = "ОченьПлохоеСлово и ещё, but this is good word"; const censored = text.replaceAll(/(?<=[а-яА-ЯёЁ])[а-яА-ЯёЁ](?=[а-яА-ЯёЁ])/g, '*'); console.log(censored); // 输出:О**************о и е*ё, but this is good word
⚠️ 注意事项
- 浏览器兼容性:replaceAll() 和正向后瞻 (?<=...) 在较老环境(如 IE、Node.js < 10.0)中不支持。若需兼容,可改用 replace() 配合全局正则 + 回调函数,或升级运行时。
- 边界情况处理:该正则默认不匹配长度 ≤ 2 的单词(如 он, я, ёж),因其无“中间字符”,符合预期;但若需处理单字节标点混排(如 слово! 中的 о!),建议先清洗或扩展字符集。
- 性能提示:环视本身不消耗字符,但多次回溯可能影响长文本性能。对于高并发过滤场景,可预编译正则对象(const censorRegex = /.../g)并复用。
- 扩展建议:如需支持其他斯拉夫语(如保加利亚语、塞尔维亚语),应补充对应字母范围(如 љњџћѕ 等),避免硬编码 а-я。
通过此方案,你无需分词或复杂状态机,即可在一行正则中稳健完成西里尔文本的中间字符脱敏,兼顾准确性、可维护性与执行效率。
本文共计825个文字,预计阅读时间需要4分钟。
相关专题:
本文介绍一种精准匹配俄文单词(含大小写及ё/Ё)中除首尾外所有字母的正则表达式方案,适用于敏感词过滤场景,配合 `string.replaceall()` 实现如“ОченьПлохоеСлово” → “О**************о”的自动星号脱敏。
在实现俄语敏感词过滤(如 swearword censoring)时,常见需求是保留单词首尾字母以维持可读性或上下文识别,同时将中间所有字符替换为星号 *。由于 JavaScript(及多数主流语言)中的 \w 默认仅匹配 ASCII 字母、数字和下划线,不包含西里尔字母,因此 /\B\w\B/g 等依赖 Unicode 类别或词边界(\b/\B)的模式在俄文文本中会失效。
正确的解决方案是使用环视断言(lookaround assertions)构建位置匹配逻辑:
- (?<=[а-яА-ЯёЁ]):正向后瞻(positive lookbehind),确保当前字符前面是一个西里尔字母;
- [а-яА-ЯёЁ]:匹配一个西里尔字母(覆盖小写 а–я、大写 А–Я,以及带分音符的 ё 和 Ё);
- (?=[а-яА-ЯёЁ]):正向前瞻(positive lookahead),确保当前字符后面也是一个西里尔字母。
三者组合 (?<=[а-яА-ЯёЁ])[а-яА-ЯёЁ](?=[а-яА-ЯёЁ]) 即精确匹配「位于两个西里尔字母之间的任意西里尔字母」——这天然排除了单词首字符(无前导西里尔字母)和末字符(无后续西里尔字母),完美满足需求。
✅ 使用示例(JavaScript)
const text = "ОченьПлохоеСлово и ещё, but this is good word"; const censored = text.replaceAll(/(?<=[а-яА-ЯёЁ])[а-яА-ЯёЁ](?=[а-яА-ЯёЁ])/g, '*'); console.log(censored); // 输出:О**************о и е*ё, but this is good word
⚠️ 注意事项
- 浏览器兼容性:replaceAll() 和正向后瞻 (?<=...) 在较老环境(如 IE、Node.js < 10.0)中不支持。若需兼容,可改用 replace() 配合全局正则 + 回调函数,或升级运行时。
- 边界情况处理:该正则默认不匹配长度 ≤ 2 的单词(如 он, я, ёж),因其无“中间字符”,符合预期;但若需处理单字节标点混排(如 слово! 中的 о!),建议先清洗或扩展字符集。
- 性能提示:环视本身不消耗字符,但多次回溯可能影响长文本性能。对于高并发过滤场景,可预编译正则对象(const censorRegex = /.../g)并复用。
- 扩展建议:如需支持其他斯拉夫语(如保加利亚语、塞尔维亚语),应补充对应字母范围(如 љњџћѕ 等),避免硬编码 а-я。
通过此方案,你无需分词或复杂状态机,即可在一行正则中稳健完成西里尔文本的中间字符脱敏,兼顾准确性、可维护性与执行效率。

