我有一个长文本(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对象。

创建一个静态类,并添加设置了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


另外,请考虑逐行处理文件,并尽可能避免使用正则表达式而不使用它们。

10-08 19:00