asp.net 脏字典过滤问题 用正则表达式来过滤脏数据

  方法一:使用正则表达式

  

复制代码 代码如下:

  //脏字典数据存放文件路径

  private static string FILE_NAME="zang.txt";

  //脏数据字典表,如:脏数据一|脏数据二|脏数据三

  public static string dirtyStr="";

  public ValidDirty()

  {

  if (HttpRuntime.Cache["Regex"]==null)

  {

  dirtyStr=ReadDic();

  //用于检测脏字典的正则表达式

  Regex validateReg= new Regex("^((?!"+dirtyStr+").(?<!"+dirtyStr+"))*$",RegexOptions.Compiled|RegexOptions.ExplicitCapture);

  HttpRuntime.Cache.Insert("Regex" ,validateReg,null,DateTime.Now.AddMinutes(20) ,TimeSpan.Zero);

  }

  }

  private string ReadDic()

  {

  FILE_NAME=Environment.CurrentDirectory+"\\"+FILE_NAME;

  if (!File.Exists(FILE_NAME))

  {

  Console.WriteLine("{0} does not exist.", FILE_NAME);

  return "";

  }

  StreamReader sr = File.OpenText(FILE_NAME);

  String input="";

  while (sr.Peek() > -1)

  {

  input += sr.ReadLine() ;

  }

  sr.Close();

  return input;

  }

  public bool ValidByReg(string str)

  {

  Regex reg=(Regex)HttpRuntime.Cache["Regex"];

  return reg.IsMatch(str) ;

  }

  感觉这种方法的执行效率不是很高,简单的测试了一下 1000字的文章,脏字典有800多个关键字

  式了一下是 1.238秒,大家有没有更好的方法,请不吝赐教!

  方法二:普通循环查找方法

  

复制代码 代码如下:

  public bool ValidGeneral(string str)

  {

  if(!File.Exists(FILE_NAME))

  {

  Console.WriteLine("文件路径或者文件路径不存在错误信息") ;

  return false;

  }

  else

  {

  StreamReader objReader = new StreamReader(FILE_NAME,System.Text.Encoding.GetEncoding("gb2312"));

  string sLine="";

  ArrayList arrText = new ArrayList();

  while (sLine != null)

  {

  sLine = objReader.ReadLine();

  if (sLine != null)

  arrText.Add(sLine);

  }

  objReader.Close();

  foreach (string sOutput in arrText)

  {

  string[] strArr=sOutput.Split('|');

  for (int i = 0; i < strArr.Length; i++)

  {

  if (str.IndexOf(strArr[i])!=-1)

  {

  return false;

  }

  }

  }

  return true;

  }

  }

  以下是测试的方法,有什么问题还大家请指出!

  

复制代码 代码如下:

  DateTime t1 =DateTime.Now;

  string str="213";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";

  ValidDirty vd=new ValidDirty() ;

  Console.WriteLine(vd.ValidByReg(str)) ;

  DateTime t2 =DateTime.Now;

  TimeSpan ts=t2-t1;

  Console.WriteLine(ts.TotalMilliseconds) ;

  Console.Read() ;

  

算法

检索文本文件长度 / 耗费时间(ms)

正则算法

  10个汉字/ 980

  100个汉字/999

  1000个汉字/1234

普通算法

  10个汉字/ 234

  100个汉字/234

  1000个汉字/265

脏字典下载

  不过这篇文章有可能有一些问题,建议看下下面2篇文章再决定使用。