【问题标题】:Improving the speed of Regex in C#提高 C# 中正则表达式的速度
【发布时间】:2021-12-18 12:08:08
【问题描述】:

有没有办法提高这个功能的速度。我经常使用它来获取“ID 值”,并且我正在思考如何使用它,这并不是最好的方法。提前致谢。

public string GetIDValues(string Elementnummer)
        {
            StringBuilder sb = new StringBuilder();
            int totalCount = 0;
            bool elementnummerAvailable = false;

            foreach (var line in ElementHostContent)
            {
                if(line.Contains("= " + Elementnummer + ";"))
                {
                    Regex regexElementbezeichner = new Regex(@";(\s*)\/\/ ([\w|\d].*)" );
                    var regexMatchElementbezeichner = regexElementbezeichner.Match(line); 
                    var elementbezeichner = regexMatchElementbezeichner.Groups[2].ToString();
                    sb.AppendLine(elementbezeichner);

                    elementnummerAvailable = true;
                }
                totalCount++;
            }

            if (totalCount == ElementHostContent.Count() && elementnummerAvailable == true)
                return sb.ToString().Trim();
            else
                return "/";
        }

输入:

= 1234; // ABC DFG HIJ (CCC)

本例中的 Elementnummer 为 1234

【问题讨论】:

标签: c# regex


【解决方案1】:

每次需要时,您都会创建一个新的正则表达式。这并不快。您应该将正则表达式变量移动到静态字段。

private static readonly Regex regexElementbezeichner = new Regex(@";(\s*)\/\/ ([\w|\d].*)" );

Regex 类将解析您的正则表达式并将其转换为高效的状态机。如果你每次都扔掉它,那是一笔不小的成本。

【讨论】:

    【解决方案2】:

    有没有办法提高速度

    是的。避免使用*(零对多)并使用+(一对多)。正则表达式是关于模式的,当作者引入零时,从零到多,正则表达式解析器必须回溯以检查所有可能性。这种详尽的回溯占用了正则表达式过程的大部分时间。


    这个匹配组([\w|\d].*) 看起来是一个主要候选者,它有很多回溯排列,我建议重构它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-09
      • 2021-01-27
      • 2013-06-15
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      相关资源
      最近更新 更多