正则表达式卡住了一些记录

本文关键字:记录 正则表达式 | 更新日期: 2023-09-27 17:53:06

有时Regex在某些值上卡住了,尽管它对大多数文档都给出了结果。

我说的是当它卡住的时候。

  1- collection = Regex.Matches(document, pattern,RegexOptions.Compiled);
  2-  if (collection.Count > 0) //This Line
            {

我调试了解决方案,想在watch窗口中查看集合的值。我看到大多数属性的结果如下:

Function evaluation disabled because a previous function evaluation timed out. You must continue execution to reenable function evaluation.

之后在第二行卡住了。

我可以看到正则表达式有一些问题,所以它进入了循环。

问题:我没有得到任何异常,是否有任何方法可以在超时后得到异常,以便我的工具可以继续进行其余的工作。

 Regex:      @"""price"">(.|'r|'n)*?pound;(?<data>.*?)</span>"
 Part of Document : </span><span>1</span></a></li>'n't't't't<li>'n't't't't't<span class='"icon icon_floorplan touchsearch-icon touchsearch-icon-floorplan none'">Floorplans: </span><span>0</span></li>'n't't't't</ul>'n't't</div>'n    </div>'n't</div>'n<div class='"details clearfix'">'n't't<div class='"price-new touchsearch-summary-list-item-price'">'r'n't<a href='"/commercial-property-for-sale/property-47109002.html'">POA</a></div>'r'n<p class='"price'">'r'n't't't<span>POA</span>'r'n't't't't</p>'r'n't<h2 class='"address bedrooms'">'r'n't<a id='"standardPropertySummary47109002'"

正则表达式卡住了一些记录

当Regex搜索需要不合理的长时间时,我如何得到一个异常?

请阅读下面关于在正则表达式搜索中设置超时的内容。

MSDN:正则表达式。MatchTimeout地产

MatchTimeout属性定义了Regex实例在操作超时之前执行单个匹配操作的大约最大时间间隔。正则表达式引擎在超时间隔过后的下一次计时检查中抛出RegexMatchTimeoutException异常。这可以防止正则表达式引擎处理需要过多回溯的输入字符串。有关更多信息,请参见正则表达式中的回溯和. net框架中正则表达式的最佳实践。

    public static void Main()
    {
        AppDomain domain = AppDomain.CurrentDomain;
        // Set a timeout interval of 2 seconds.
        domain.SetData("REGEX_DEFAULT_MATCH_TIMEOUT", TimeSpan.FromSeconds(2));
        Object timeout = domain.GetData("REGEX_DEFAULT_MATCH_TIMEOUT");
        Console.WriteLine("Default regex match timeout: {0}",
                            timeout == null ? "<null>" : timeout);
        Regex rgx = new Regex("[aeiouy]");
        Console.WriteLine("Regular expression pattern: {0}", rgx.ToString());
        Console.WriteLine("Timeout interval for this regex: {0} seconds",
                            rgx.MatchTimeout.TotalSeconds);
    }
    // The example displays the following output: 
    //       Default regex match timeout: 00:00:02 
    //       Regular expression pattern: [aeiouy] 
    //       Timeout interval for this regex: 2 seconds

为什么我的Regex卡住了?

首先,尝试优化你的Regex,尽可能减少反向引用。斯特里比舍夫的评论有了进步,所以他值得称赞。

的另一件事:你的正则表达式实际上是相当于"价格"> [' s ' s] ?磅;(。 ?) (c#声明:@"价格"> [' s ' s] ?磅;(。 ?)")。因为回溯的次数少得多,所以情况要好得多。——stribizhev Jun 4 at 9:23

其次,如果你遇到特定值的问题,你可以做的第一件事就是跟踪它们,让逻辑每个迭代 (match),而不是用一行代码抓取所有匹配。

MSDN:匹配。NextMatch方法

   public static void Main()
   {
      string pattern = "a*";
      string input = "abaabb";
      Match m = Regex.Match(input, pattern);
      while (m.Success) {
         Console.WriteLine("'{0}' found at index {1}.", 
                           m.Value, m.Index);
         m = m.NextMatch();
      }
   }

为了在不使用模式的情况下提高基准性能,通常将Regex对象放在静态类中并只实例化一次,并添加RegexOptions。在实例化它时编译为您的Regex(您已经完成了)。(源)

p。故意造成一个总是可重复的超时是很方便的,也就是无限循环。我将在下面分享。

string pattern = @"/[a-zA-Z0-9]+('[([^]]*(]"")?)+])?$";
string input = "/aaa/bbb/ccc[@x='1' and @y='"/aaa[name='z'] '"]";