专业网站建设品牌,十四年专业建站经验,服务6000+客户--广州京杭网络
免费热线:400-683-0016      微信咨询  |  联系我们

C#使用正则替换文章屏蔽词,速度超快1毫秒处理1500个屏蔽词,6KB的文章

当前位置:网站建设 > 技术支持
资料来源:网络整理       时间:2023/2/14 1:11:36       共计:3638 浏览
今天应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]+$", 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的变形写法不被替换)
版权说明:
本网站凡注明“广州京杭 原创”的皆为本站原创文章,如需转载请注明出处!
本网转载皆注明出处,遵循行业规范,如发现作品内容版权或其它问题的,请与我们联系处理!
欢迎扫描右侧微信二维码与我们联系。
·上一条:C# 实现敏感词过滤 | ·下一条:C# 敏感词过滤方案(Trie Tree实现)

Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有    粤ICP备16019765号 

广州京杭网络科技有限公司 版权所有