在哪里存储正则表达式?

时间:2010-03-05 17:25:43

标签: c# .net regex

当您使用Regex实例时,在一个方法中使用该实例,该方法被调用几千次来以某种方式解析事物,该方法是否包含Regex实例,或者Regex实例应该是该类作为静态成员?

我觉得初始化相同的正则表达式数千次可能是一个开销。但我主要关心的是最佳做法。

我应该在哪里声明和定义正则表达式?

编辑:伪代码:

static Regex regex ...

IEnumerable<string> Parse (string str)
{
    var matches = // use regex
    foreach (var match in matches)
    {
        ...
    }
}

void Main()
{
    foreach (var page in pages)
    {
         Parse (page); ...
    }
}

3 个答案:

答案 0 :(得分:2)

如果你在循环中调用正则表达式数千次,静态方法会为你实现基于LRU的缓存。

我只是依赖它,除非你的方法在你的应用程序的生命周期中偶尔被调用数千次,你可能最好在你的类中放置一个静态引用。这取决于您的具体用例。

请参阅:http://blogs.msdn.com/bclteam/archive/2006/10/19/regex-class-caching-changes-between-net-framework-1-1-and-net-framework-2-0-josh-free.aspx

答案 1 :(得分:2)

如果您担心这类内容,那么包装您的解析功能的类应该包含一个私有引用(如果它是静态用法,可能是静态的),如果你担心这种东西。

修改

对我来说,这并不是关于性能,因为有内部缓存和Jimmy所提到的所有爵士乐,我认为正则表达式的创建可能不像实际的正则表达式处理那么昂贵。它更多的是关于设计原则:工厂方法或解析实用程序在概念上使用一些内部过滤器(正则表达式)来为您生成列表。如果它是一遍又一遍地使用的那个,那么概念上就是你要创造一次然后保持并一遍又一遍地使用它。

答案 2 :(得分:1)

我几乎总是将正则表达式创建为将要使用它的类的静态成员,或者如果在许多地方使用它,则在常见的utils类中创建。