.NET C#正则表达式优化 - 我可以解决这个性能问题吗?

时间:2011-03-07 11:01:59

标签: .net regex

我遇到了一些我写过的正则表达式代码的性能问题。

涉及两个正则表达式:

第一个是直接文本搜索,传递给以下C#代码,以便我可以计算文本中的实例:

textMatchRegExp1:string that im searching for

第二个匹配html注释中存在的文本,允许空格。

textMatchRegExp2:<!--.*(-->){0}.*(string that im searching for)+.*(<!--){0}.*-->

这些表达式的目的是让我可以找到文本是否出现在页面的html源代码中,但不在注释中。如果textMatchRegExp1找到的总计数大于textMatchRegExp2,则必须在注释中找不到文本的实例。

我知道这看起来并不是最简单的方法,我认为背后有消极/积极的看法,但就我能解决而言,这似乎不适合我的问题(请纠正我,如果我是错)。

我已经确定了这个方法,因为这个方法通过单元测试可以非常可靠地工作,即使文本在同一个注释中多次存在。

我的问题是,对于我测试的某些网页来说,这被证明是无法接受的慢,在某些情况下完全冻结应用程序。

无论如何我可以优化reg ex搜索吗?我已经为上下文包含了完整的C#代码。

public static bool StringExistsInSource(string text, string html)
        {
            text = text.ToLower();

            text = text.Replace(" ", @"\s+"); // Add in white space to  match

            html = html.ToLower();

            // Matches up all instances of text, including those in comments 
            string textMatchRegExp = text;

            // Matches up comments containing text
            string textWithinCommentRegExp = "<!--.*(-->){0}.*(" + text + ")+.*(<!--){0}.*-->"; 

            // Read total count of ALL matches
            int textMatchCount = Regex.Matches(html, textMatchRegExp).Count;

            int textWithinCommentCount = 0;

            // Iterate through comments containing given text

            foreach (Match m in Regex.Matches(html, textWithinCommentRegExp))
            {
                textWithinCommentCount += Regex.Matches(m.ToString(), textMatchRegExp).Count;
            }

            // If text exists outside of comments,
            // the total match count will be higher than the 
            // text within comments count

            return textMatchCount > textWithinCommentCount;
        }

1 个答案:

答案 0 :(得分:1)

如果您正在搜索不同html页面中的相同文本(而不是在同一个html页面中搜索“text”的不同值),您可以尝试使用{{1编译正则表达式}}

但是,如果您没有重复使用正则表达式,那么编译不会给您带来任何性能优势(因为您第一次使用正则表达式时很慢)并且可能会使应用程序的内存占用空间膨胀(因为,如果我没记错的话) ,来自编译正则表达式的生成代码不能被垃圾收集)