【发布时间】:2015-07-15 14:03:02
【问题描述】:
我有一个长文本(50-60 KB),我需要针对它运行几个正则表达式(总共大约 100 条规则)。但是,这太慢了,以至于它基本上不起作用。
我所做的只是围绕规则创建一个循环,其中每个规则执行一个Regex.IsMatch()。
有没有办法优化这个?
更新
每个规则执行的示例代码:
public class SomeRegexInterceptor : ValidatorBase
{
private readonly Regex _rgx = new Regex("some regex", RegexOptions.Compiled | RegexOptions.IgnoreCase | RegexOptions.Singleline);
public override void Intercept(string html, ValidationResultCollection collection)
{
if (!_rgx.IsMatch(html)) return;
/* do something irrelevant here */
}
}
【问题讨论】:
-
确保使用
RegexOptions.Compiled标志在循环外初始化正则表达式。还要尽可能多地从循环中删除。如果您可以逐行工作,请尝试这样做,而不是搜索一个 50-60KB 的巨大字符串。 -
@AeroX - 我不是你可以查看示例代码以供参考
-
你在哪里创建了这个类实例多少次?它不是静态的,正则表达式在实例创建时被初始化。那是低效的。
-
正则表达式本身也很可能/需要优化。对每个正则表达式匹配进行计时,以查看是否存在需要非常长时间才能匹配(或无法匹配)的正则表达式。此类问题通常来自catastrophic backtracking。