c# - 通过对大文本多次调用 Regex.IsMatch 来优化性能

标签 c# regex

我有一个很长的文本 (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 中概述的建议,即:

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

关于c# - 通过对大文本多次调用 Regex.IsMatch 来优化性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31432630/

相关文章:

c# - 将 Controller 操作呈现为字符串(使用虚拟路径,无操作/ Controller 名称)ASP.NET MVC 3

c# - 如何使用 WCF 服务引用使用 RPC 样式的 Web 服务?

c# - 如何使用蓝牙套接字从游戏 Controller 接收按钮事件?

regex - Bash 脚本正则表达式...如何查找和替换所有匹配项?

regex - 使用正则表达式在Apache Hive中创建表将返回所有NULL值

c# - 当 & 与两个整数一起使用时出现奇怪的结果 C#

c# - IBMMQDotnet 客户端重试机制

javascript - 字符串原型(prototype)在浏览器中有效,但在 Node 中无效

Java 模式捕获词

c# - SQL 查询的正则表达式给出空的 MatchCollection