使用正则替换文章屏蔽词,1500个屏蔽词,6KB的文章,替换用时01毫秒

本文介绍了一种利用正则表达式高效过滤敏感词的方法,并通过优化实现了性能百倍提升。文中提供了具体实现代码及示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用正则替换文章屏蔽词,这个功能很早就用到了,由于使用过程中并未感觉到什么压力,所以一直没有对其性能进行优化。

今天应leader要求,对性能进行了一下测试并作出改进,发现改进后的性能提高了100多倍!原来替换一篇文章用时130多毫秒,现在只需要不到1毫秒的时间!

前后主要差别在于正则的生成和循环文章内容的次数。

下边贴出主要代码供大家参考。

private static readonly Regex reg_b = new Regex(@"/B", RegexOptions.Compiled); private static readonly Regex reg_en = new Regex(@"[a-zA-Z]+", RegexOptions.Compiled); private static readonly Regex reg_num = new Regex(@"^[/-/./s/d]+{1}quot;, RegexOptions.Compiled); private static Regex reg_word = null; //组合所有屏蔽词的正则 private static Regex GetRegex() { if (reg_word == null) { reg_word = new Regex(GetPattern(), RegexOptions.Compiled | RegexOptions.IgnoreCase); } return reg_word; } /// <summary> /// 检查输入内容是否包含脏词(包含返回true) /// </summary> public static bool HasBlockWords(string raw) { return GetRegex().Match(raw).Success; } /// <summary> /// 脏词替换成*号 /// </summary> public static string WordsFilter(string raw) { return GetRegex().Replace(raw, "***"); } /// <summary> /// 获取内容中含有的脏词 /// </summary> public static IEnumerable<string> GetBlockWords(string raw) { foreach (Match mat in reg_word.Matches(raw)) { yield return (mat.Value); } } private static string GetPattern() { StringBuilder patt = new StringBuilder(); string s; foreach (string word in GetBlockWords()) { if (word.Length == 0) continue; if (word.Length == 1) { patt.AppendFormat("|({0})", word); } else if (reg_num.IsMatch(word)) { patt.AppendFormat("|({0})", word); } else if (reg_en.IsMatch(word)) { s = reg_b.Replace(word, @"(?:[^a-zA-Z]{0,3})"); patt.AppendFormat("|({0})", s); } else { s = reg_b.Replace(word, @"(?:[^/u4e00-/u9fa5]{0,3})"); patt.AppendFormat("|({0})", s); } } if (patt.Length > 0) { patt.Remove(0, 1); } return patt.ToString(); } /// <summary> /// 获取所有脏词 /// </summary> public static string[] GetBlockWords() { return new string[]{"国民党","fuck","110"};//这里应该从数据库获取 }

这个程序可替换以下内容:

国民党

国-民-党

国o民o党

fuck

f.u.c.k

110(110的变形写法不被替换)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值