正则表达式性能非常慢?

时间:2012-05-31 17:05:20

标签: c# .net performance

我的申请非常缓慢,有时需要数小时才能恢复正常。当我使用探查器时,我发现代码占用了大量的时间,这只是正则表达式匹配发生的地方。任何人都可以指导我如何提高性能。代码段如下所示

Regex rx = new Regex(@"^[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\@[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*\.[A-Za-z0-9]([_\.\-]?[A-Za-z0-9]+)*$|^$");
rx.IsMatch("john.gilbert.stu.seattle.washington.us"); 

有什么方法可以缓存模式并重用它?

2 个答案:

答案 0 :(得分:3)

通过编译和缓存它们可以在某种程度上提高RegEx的速度,但它不太可能在您拥有的规模上解决性能问题。即由于缓存/编译或任何其他类型的自动处理,一些需要O(n ^ 2)的慢速RegEx不会神奇地变成O(n)。

您需要检查正则表达式并验证每个表达式的执行次数。最快的代码是根本不需要运行的代码 - 如果你有任何第一个代码,那么就消除浪费的匹配。您可能需要切换到更合适的解析文本的方式(即,HTML的RegEx解析很可能是错误的方式 - 像HtmlAgilityPack这样的好的HTML解析器与目标查询相结合可能更合适。)

答案 1 :(得分:1)

如果字符串的解析不那么复杂,我会将它们转换为字符数组并自己解析它们。它将大大提高性能。 RegEx的表现非常差。

for (int i = 0; i < string.Length; i++)
{
     if (string[i] has some defining quality)
         if (string[i] meets second requirement)
         // break, change flag, ect.
}