zoukankan      html  css  js  c++  java
  • 正则匹配超时处理

    使用正则匹配比较大的数据时就会发生程序超时并没有异常弹出,而且电脑cpu会到达100%

    在.Net4.5中微软有改进的方法,直接调用很方便,但.Net4.5以下就没有,下面写下自己找的处理方法

    1、.Net4.5中:  

    Regex reg = new Regex(正则, RegexOptions.IgnoreCase, TimeSpan.FromSeconds(2));

    TimeSpan.FromSeconds就是设置的超时时间,如超过就返回为空,FromSeconds=2是秒,也可以设置分钟小时

    2、.Net4.0中:

    复制代码
     1 /// <summary>
     2         /// 正则解析
     3         /// </summary>
     4         /// <param name="regex">正则对象</param>
     5         /// <param name="input">需要解析的字符串</param>
     6         /// <param name="OutTimeMilliseconds">超时时间</param>
     7         /// <returns></returns>
     8         public static MatchCollection Matchs(Regex regex, string input, int OutTimeMilliseconds)
     9         {
    10             MatchCollection mc = null;
    11             AutoResetEvent are = new AutoResetEvent(false);
    12             Thread t = new Thread(delegate()
    13             {
    14                 mc = regex.Matches(input);
    15                 //注意,在这里一定要把所有的匹配项遍历一次,不然的话当在此方法外遍历的话.也可能会出现等待情况
    16                 foreach (Match m in mc) { }
    17                 are.Set();
    18             });
    19             t.Start();
    20             Wait(t, TimeSpan.FromMilliseconds(OutTimeMilliseconds), are, null);
    21             return mc;
    22         }
    23 
    24         /// <summary>
    25         /// 等待方法执行完成,或超时
    26         /// </summary>
    27         /// <param name="t"></param>
    28         /// <param name="OutTime"></param>
    29         /// <param name="ares"></param>
    30         private static void Wait(Thread t, TimeSpan OutTime, WaitHandle are, WaitHandle cancelEvent)
    31         {
    32             WaitHandle[] ares;
    33             if (cancelEvent == null)
    34                 ares = new WaitHandle[] { are };
    35             else
    36                 ares = new WaitHandle[] { are, cancelEvent };
    37             int index = WaitHandle.WaitAny(ares, OutTime);
    38             if ((index != 0) && t.IsAlive)//如果不是执行完成的信号,并且,线程还在执行,那么,结束这个线程
    39             {
    40                 t.Abort();
    41                 t = null;
    42             }
    43         }
    44 
    45         /// <summary>
    46         /// 正则解析
    47         /// </summary>
    48         /// <param name="regex">正则对象</param>
    49         /// <param name="input">需要解析的字符串</param>
    50         /// <param name="OutTimeMilliseconds">超时时间</param>
    51         /// <returns></returns>
    52         public static Match Match(Regex regex, string input, int OutTimeMilliseconds)
    53         {
    54             Match m = null;
    55             AutoResetEvent are = new AutoResetEvent(false);
    56             Thread t = new Thread(delegate() { m = regex.Match(input); are.Set(); });
    57             t.Start();
    58             Wait(t, TimeSpan.FromMilliseconds(OutTimeMilliseconds), are, null);
    59             return m;
    60         }
    复制代码
  • 相关阅读:
    利用JavaScript+DIV+CSS实现下拉菜单。当鼠标移动到菜单选项的时候显示对应的DIV:function show(menu)。当鼠标移出的时候隐藏所有的DIV:function hide()。
    java编程——图片旋转
    名言
    利用CSS对注册页面实现修饰
    软件过程
    Warning: Failed to halt at after bootloader, forced stop at
    cc2650 7x7封装更换为 5X5 4x4
    IAR 路径导致的错误
    cc2650-cc2640蓝牙开发准备手记
    window10装机 nvem简介,针对于 联想R720系列
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/10335483.html
Copyright © 2011-2022 走看看