.NET 4.7.1下忽略大小写过滤敏感词并保留原文本大小写的实现
.NET 4.7.1下实现忽略大小写的敏感词过滤(保留原文本格式)
由于.NET 4.7.1的string.Replace不支持忽略大小写的重载,我们可以通过正则表达式+自定义替换逻辑实现需求:既忽略大小写匹配敏感词,又保留原文本的格式(仅将敏感词替换为等长*)。
核心实现思路
- 对敏感词进行正则转义,避免因敏感词包含正则元字符(如
.、*)导致匹配异常; - 使用
RegexOptions.IgnoreCase开启忽略大小写匹配; - 通过
MatchEvaluator自定义替换规则:将每个匹配到的敏感词片段替换为对应长度的*,其他文本完全保留原格式。
完整代码实现
using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; public class SensitiveWordFilter { public static string Filter(string text, IEnumerable<string> badWords) { // 边界判断:空文本或无敏感词直接返回原内容 if (string.IsNullOrEmpty(text) || badWords == null || !badWords.Any()) return text; // 转义每个敏感词的正则特殊字符 var escapedBadWords = badWords.Select(word => Regex.Escape(word)); // 构建匹配任意敏感词的正则模式 var regexPattern = string.Join("|", escapedBadWords); // 初始化正则实例,开启忽略大小写 var regex = new Regex(regexPattern, RegexOptions.IgnoreCase); // 执行替换:每个匹配项替换为等长的* return regex.Replace(text, match => new string('*', match.Length)); } }
测试示例
// 测试数据 var badwords = new[] { "home" }; var text = "Home, hhhome HOME, HOme Hhome1212, H o M e"; // 执行过滤 var filteredText = SensitiveWordFilter.Filter(text, badwords); // 输出结果:****, hh**** ****, **** H****1212, ******* Console.WriteLine(filteredText);
关键说明
- 正则转义:
Regex.Escape确保敏感词中的特殊字符(如home.)被当作普通文本匹配,不会触发正则逻辑; - 保留格式:仅替换匹配到的敏感词片段,原文本的空格、标点、非敏感词的大小写完全保留;
- 性能优化:正则实例可根据需求缓存(如敏感词列表固定时),避免重复构建正则对象。
内容的提问来源于stack exchange,提问作者Nik
相关产品推荐
相关产品推荐

