西西软件园多重安全检测下载网站、值得信赖的软件下载站!
软件
软件
文章
搜索

首页编程开发其它知识 → 文章中的特殊词语使用正则替换屏蔽

文章中的特殊词语使用正则替换屏蔽

相关软件相关文章发表评论 来源:西西整理时间:2011/5/10 14:03:17字体大小:A-A+

作者:西西点击:81次评论:2次标签: 正则

  • 类型:电子教程大小:9.5M语言:中文 评分:8.0
  • 标签:
立即下载

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

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

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

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

view sourceprint?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的变形写法不被替换)

    相关评论

    阅读本文后您有什么感想? 已有人给出评价!

    • 8 喜欢喜欢
    • 3 顶
    • 1 难过难过
    • 5 囧
    • 3 围观围观
    • 2 无聊无聊

    热门评论

    最新评论

    发表评论 查看所有评论(2)

    昵称:
    表情: 高兴 可 汗 我不要 害羞 好 下下下 送花 屎 亲亲
    字数: 0/500 (您的评论需要经过审核才能显示)