c#缓慢的正则表达式性能

本文关键字:性能 正则表达式 缓慢 | 更新日期: 2023-09-27 18:01:24

我是正则表达式的新手。如何优化这个正则表达式:

private static readonly Regex rgx = new Regex(@"(.*)</([a-z]+)>([0-9.]+)<(.*)", RegexOptions.Compiled);

我在一个递归函数上使用了它:

    private static string ReplaceMe(string temp)
    {
        if (rgx.IsMatch(temp))
        {
            temp = rgx.Replace(temp, delegate(Match m)
            {
                return m.Groups[1].Value + "</" + m.Groups[2].Value + "><span style='"display:inline'">" + m.Groups[3].Value + "</span><" + m.Groups[4].Value;
            });
            return ReplaceMe(temp);
        }
        return temp;
    }

分析器说语句:

if (rgx.IsMatch(temp))

导致性能问题,所以我需要优化正则表达式。

编辑:我最终使用regex

([^<]*)</([a-z]+)>([0-9.]+)<(.*)

c#缓慢的正则表达式性能

您的regexp有点容易发生灾难性的回溯。因为(.*)可以和</([a-z]+)重叠。如果您搜索的文本没有找到匹配项,那么就会产生问题,因为有很多标签,因此第二组可以从很多地方开始。

但是,除非您告诉我们您打算如何使用regexp,否则我们无能为力。

你可以考虑

</([a-z]+)>([0-9.]+)<

([^<]*)</([a-z]+)>([0-9.]+)<(.*)

或者您可能想使用xml解析器

在某些情况下,如果您使用RegexOptions.Compiled,则性能不是很好。

看这里

尝试删除RegexOptions。编译,看看是否更好。