regex 匹配收集超时

o3imoua4  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(111)

我正在使用matchcollection来解析html。但是这个解决方案花费了很长时间,有时候会失败。我想如果我设置matchcollection超时,这个问题就会解决。我怎么设置matchcollection的超时呢?(框架4.0)

anchorPattern[0]="<div.*?class=\"news\">.*?<div.*?class=\".*?date.*?\">(?<date>.*?)?</div>.*?<a.*?href=\"(?<link>.*?)\".*?>(?<title>.*?)?</a>.*?<(span.*?class=\".*?desc.*?\">(?<spot>.*?)?</span>)?"
    MatchCollection mIcerik = Regex.Matches(html, anchorPattern[i], RegexOptions.Compiled);
    if (mIcerik.Count > 0)
          ListDegree.Add(i,mIcerik.Count);
x4shl7ld

x4shl7ld1#

你的正则表达式中有太多的".*?",可能你的一些输入的可能组合的数量接近“无限”。试着使用原子组"(?>.*?)"来代替,以自动丢弃组中任何标记所记住的所有回溯位置。这至少会使所有正则表达式解析花费有限的时间。

vxqlmq5t

vxqlmq5t2#

TimeSpan timeout = new TimeSpan(0, 1, 0);

anchorPattern[0]="<div.*?class=\"news\">.*?<div.*?class=\".*?date.*?\">(?<date>.*?)?</div>.*?<a.*?href=\"(?<link>.*?)\".*?>(?<title>.*?)?</a>.*?<(span.*?class=\".*?desc.*?\">(?<spot>.*?)?</span>)?"

MatchCollection mIcerik = Regex.Matches(html, anchorPattern[i], RegexOptions.Compiled,timeout);
 
 
if (mIcerik.Count > 0)
      ListDegree.Add(i,mIcerik.Count);

Timespan参数建立一个超时间隔以匹配所有对象。或者您可以使用Regex.InfiniteMatchTimeout来指示该方法不应超时。MSDN regex.Matches()

相关问题