Java中使用正则表达式审查敏感词并替换中间字符为星号
实现敏感词部分替换为星号的方案
这个需求在内容审核场景里挺常见的,结合你已有的正则匹配规则,只需要给正则替换加个回调逻辑就能轻松搞定!核心思路是:匹配到敏感词后,保留首尾字符,中间的所有字符替换成对应数量的星号。
具体实现(以Python为例)
假设你已经有了能精准匹配敏感词的正则pattern,我们可以用re.sub()的回调函数特性来处理每个匹配结果:
import re def censor_sensitive_word(match_obj): # 获取匹配到的完整敏感词 word = match_obj.group() # 短词(长度≤2)直接返回原词,避免过度替换反而显得突兀 if len(word) <= 2: return word # 首字符 + 对应数量的中间星号 + 尾字符 return word[0] + '*' * (len(word) - 2) + word[-1] # 你的原始消息 original_message = "This is example message with bad words like FWORD" # 替换敏感词(把下面的r'\bFWORD\b'换成你自己的正则pattern即可) censored_message = re.sub(r'\bFWORD\b', censor_sensitive_word, original_message) print(censored_message) # 输出结果:This is example message with bad words like F***D
关键逻辑解释
- 回调函数处理匹配结果:
re.sub()的第二个参数可以传一个函数,这个函数会接收每个匹配到的对象,我们在函数里对敏感词做自定义替换逻辑。 - 短词特殊处理:如果敏感词只有2个字符(比如"fu"),替换成"f*u"反而可能更引人注意,所以直接返回原词更合理。
- 适配多敏感词场景:如果你的正则pattern是匹配多个敏感词(比如
r'\b(FWORD|BADWORD|NASTY)\b'),这个方案完全适用,每个匹配到的词都会被自动处理。
其他语言的通用思路
不管用什么编程语言,核心逻辑都是一致的:
- 用正则匹配所有目标敏感词
- 对每个匹配到的词,执行「保留首尾字符+中间替换为星号」的操作
- 将处理后的词替换回原文本
比如JavaScript的实现示例:
const originalMsg = "This is example message with bad words like FWORD"; const censoredMsg = originalMsg.replace(/\bFWORD\b/g, (word) => { if (word.length <= 2) return word; return word[0] + '*'.repeat(word.length - 2) + word.slice(-1); }); console.log(censoredMsg); // 输出同样的脱敏结果
内容的提问来源于stack exchange,提问作者Tomasz




