zoukankan      html  css  js  c++  java
  • 关于脏字典过滤问题-用正则表达式来过滤脏数据


    方法一:使用正则表达式

     1//脏字典数据存放文件路径
     2        private static string FILE_NAME="zang.txt";
     3        //脏数据字典表,如:脏数据一|脏数据二|脏数据三
     4        public static string dirtyStr="";
     5        
     6        public ValidDirty()
     7        {
     8            if (HttpRuntime.Cache["Regex"]==null)
     9            {
    10                dirtyStr=ReadDic();
    11                //用于检测脏字典的正则表达式
    12                Regex validateReg= new Regex("^((?!"+dirtyStr+").(?<!"+dirtyStr+"))*$",RegexOptions.Compiled|RegexOptions.ExplicitCapture);    
    13                HttpRuntime.Cache.Insert("Regex" ,validateReg,null,DateTime.Now.AddMinutes(20) ,TimeSpan.Zero);
    14            }

    15            
    16        }

    17        private string ReadDic()
    18        {
    19            FILE_NAME=Environment.CurrentDirectory+"\\"+FILE_NAME;
    20
    21            if (!File.Exists(FILE_NAME)) 
    22            {
    23                Console.WriteLine("{0} does not exist.", FILE_NAME);
    24                return "";
    25            }

    26            StreamReader sr = File.OpenText(FILE_NAME);
    27            String input="";
    28            while (sr.Peek() > -1
    29            {
    30                input += sr.ReadLine() ;
    31            }

    32            
    33            sr.Close();
    34            return input;
    35
    36        }

    37
    38        
    39        public bool ValidByReg(string str)
    40        {
    41            Regex reg=(Regex)HttpRuntime.Cache["Regex"];
    42            return reg.IsMatch(str) ;
    43            
    44        }


    感觉这种方法的执行效率不是很高,简单的测试了一下 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;

                }


            }


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

     1DateTime t1 =DateTime.Now;
     2            string str="213";
     3            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
     4            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
     5            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
     6            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
     7            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
     8            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
     9            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    10            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    11            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    12            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";    
    13            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    14            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    15            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    16            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    17            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    18            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    19            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    20            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    21            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    22            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    23            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    24            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    25            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    26            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    27            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    28            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    29            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    30            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    31            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    32            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    33            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    34            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    35            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    36            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    37            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    38            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    39            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    40            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    41            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    42            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    43            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    44            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    45            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    46            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    47            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    48            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    49            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    50            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    51            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    52            str+="珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋珍惜水晶之恋";
    53            ValidDirty vd=new ValidDirty() ;
    54            Console.WriteLine(vd.ValidByReg(str))  ;
    55            DateTime t2 =DateTime.Now;
    56            TimeSpan ts=t2-t1;
    57            Console.WriteLine(ts.TotalMilliseconds) ; 
    58            Console.Read() ;

    算法

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

    正则算法

    10个汉字/ 980

    100个汉字/999

    1000个汉字/1234

    普通算法

    10个汉字/ 234

    100个汉字/234

    1000个汉字/265



    脏字典下载
  • 相关阅读:
    ElasticSearch聚合分析API——非常详细,如果要全面了解的话,最好看这个
    wiredtiger引擎性能——比levelDB更牛叉!
    mongodb数据文件结构——record是内嵌BSON的双向链表,多个record或索引组成extent
    MongoDB Wiredtiger存储引擎实现原理——Copy on write的方式管理修改操作,Btree cache
    elasticsearch聚合操作——本质就是针对搜索后的结果使用桶bucket(允许嵌套)进行group by,统计下分组结果,包括min/max/avg
    splunk的统计分析功能——特定字段的统计功能包括取值分布(+topK,min/max/平均值)
    在SQLAlter在现场一定的价值
    Android4.0设置接口变更摘要(四)
    Nagios监控生产环境redis群集服务战
    Facebook Asynchronous Layout and Rending
  • 原文地址:https://www.cnblogs.com/goody9807/p/502094.html
Copyright © 2011-2022 走看看