C#中Regex.Match的静态版本与实例版本

时间:2009-07-20 20:12:13

标签: c# regex performance

我注意到一些使用静态方法的代码:

Regex.IsMatch([someRegexStr], [someInputStr])

是否值得用实例方法替换它?像:

private readonly Regex myRegex = new Regex([someRegexStr]);

...

myRegex.IsMatch([someInputStr]);

4 个答案:

答案 0 :(得分:6)

以下链接中的正则表达式优化建议之一: Regular Expression OptimizationJim Mischel

为了在常用正则表达式上获得更好的性能,请构造一个Regex对象并调用其实例方法。

article包含一些有趣的主题,例如缓存正则表达式和编译正则表达式以及优化建议。

答案 1 :(得分:3)

当您调用静态Regex.IsMatch()方法时会发生一些初始处理 - 主要是为了验证您的正则表达式并将其转换为有限状态机表示。

如果您计划多次运行相同的正则表达式匹配,则最好实例化Regex实例并调用实例IsMatch()方法。您可以使用RegexOptions.Compiled标志将epxression编译为CLR字节码,从而进一步提高性能。

答案 2 :(得分:3)

缓存从静态调用创建的最后15个正则表达式内部表示。

我在“How .NET Regular Expressions Really Work。”

中讨论了这个问题和内部工作原理

答案 3 :(得分:2)

是的,特别是如果你可以把它变成一个编译过的表达式。以这种方式构造Regex对象的速度较慢,但​​使用它的速度要快得多。

编辑:可能(可能是++)要快得多。没有要求CLI有一个很好的优化,但我猜测微软当然是。 :d

private readonly Regex myRegex = new Regex([someRegexStr], RegexOptions.Compiled);
相关问题