我有一个很长的文本 (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 */
}
}
最佳答案
关于使用 Regex 替换的最重要的事情是您声明 Regex 的方式和位置。 切勿在循环内初始化 Regex 对象。
创建一个静态类并添加 public static readonly
正则表达式字段并设置 RegexOptions.Compiled
标志。
然后,使用类似 MyRegexClass.LeadingWhitespace.Replace(str, string.Empty)
的东西在任何需要的地方使用它们。
注意,如果需要使用Regex.Replace
,则不需要在之前检查是否与Regex.IsMatch
匹配。
阅读并遵循 Best Practices for Regular Expressions in the .NET Framework 中概述的建议,即:
- Consider the Input Source
- Handle Object Instantiation Appropriately
- Take Charge of Backtracking
- Use Time-out Values
- Capture Only When Necessary
另外,考虑逐行处理文件,尽可能避免使用正则表达式。
关于c# - 通过对大文本多次调用 Regex.IsMatch 来优化性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31432630/