MatchCollection.Count永无止境

时间:2018-11-29 16:20:15

标签: c# regex match

我在Regex制作的MatchCollection中遇到问题。当我在此MatchCollection中使用.Count时,处理永远不会像无限循环中的优先级那样结束。

从技术上讲,MatchCollection无法计算列表中有多少个元素,那么如果我在foreach中使用此列表,则会陷入困境。

代码是:

var matches = Regex.Matches(OriginalSource, "(function)(.*?){(?:[^{}]+|{(?<n>)|}(?<-n>))+(?(n)(?!))*}", RegexOptions.IgnoreCase);
var ssc = 0;

try {
ssc = matches.Count;
} catch (Exception ex) {
throw new Exception("LOL");
}

foreach (Match match in matches) {
// ...
}

字符串OriginalSource是:https://pastebin.com/UcL710g7?fbclid=IwAR1HNXZpkxo76Ecxdib9XgaBu0Rz2YmJsRoKFOmrPvLYjQkyY3nKl8RSbgI

我该如何处理?这没有异常,可以创建超时过程吗?因为我可以忽略此代码,但是此列表不允许我向前移动。

2 个答案:

答案 0 :(得分:3)

  

是否可以创建超时流程?

var matches = Regex.Matches(OriginalSource,
     "(function)(.*?){(?:[^{}]+|{(?<n>)|}(?<-n>))+(?(n)(?!))*}", 
     RegexOptions.IgnoreCase, TimeSpan.FromSeconds(2));

添加一个超时(超时有效)。这是在.NET 4.5中添加的。

答案 1 :(得分:0)

您的正则表达式有一个错误,它使用贪婪量化。 这导致过多的回溯。

我尝试将正则表达式更改为使用non greedy quantifiers,现在需要less than a second

这是正则表达式:

@"(function)(.*?){(?:[^{}]+|{(?<n>)|}(?<-n>))+?(?(n)(?!))*?}"

与您完全一样,只是它使用了非贪婪的量词。

您可以在此处测试C#正则表达式:http://bak-o-soft.dk/RegEx/RegExBuilder.aspx