我在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
我该如何处理?这没有异常,可以创建超时过程吗?因为我可以忽略此代码,但是此列表不允许我向前移动。
答案 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