使用正則替換文章屏蔽詞,1500個屏蔽詞,6KB的文章,替換用時1毫秒
使用正則替換文章屏蔽詞,這個功能很早就用到了,由于使用過程中并未感覺到什么壓力,所以一直沒有對其性能進行優(yōu)化。
今天應(yīng)leader要求,對性能進行了一下測試并作出改進,發(fā)現(xiàn)改進后的性能提高了100多倍!原來替換一篇文章用時130多毫秒,現(xiàn)在只需要不到1毫秒的時間!
前后主要差別在于正則的生成和循環(huán)文章內(nèi)容的次數(shù)。
下邊貼出主要代碼供大家參考。
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>
/// 檢查輸入內(nèi)容是否包含臟詞(包含返回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>
/// 獲取內(nèi)容中含有的臟詞
/// </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"};//這里應(yīng)該從數(shù)據(jù)庫獲取
}
這個程序可替換以下內(nèi)容:
國民黨
國-民-黨
國o民o黨
fuck
f.u.c.k
110(110的變形寫法不被替換)