2010-11-22 67 views
3

早上好编译选项,Regex.Replace在一个周期

比方说,我有下面的代码,这attemps从每个字符串中给定的列表中删除任何空白:

foreach (String StrTmp in SomeList) 
    Regex.Replace(StrTmp, @"\p{Z}", "", RegexOptions.Compiled) 

由于RegexOptions.Compiled的文档说,“这会产生更快的执行速度,但会增加启动时间”,我想知道这个增加的启动时间是指整个程序的启动时间还是指周期内每个Regex.Replace函数调用的启动,因此使整个循环变慢。

顺便说一句......是不是有任何Regex.Remove(.,.)命令来删除给定的正则表达式的每一次发生?基本上这与上述相同,但可以更短,更优雅。

非常感谢。

回答

5

它指的是正则表达式编译时间。但编译选项是为一次创建并经常使用的正则表达式设计的,所以最好在循环之外创建并重用它。

Regex theRegex = new Regex(@"\p{Z}", RegexOptions.Compiled); 
foreach (String StrTmp in SomeList) 
    string replacementString = theRegex.Replace(StrTmp, ""); 
+0

错了,看看我的评论。 – Migol 2010-11-22 09:33:04

+2

什么是'错误'?是的,静态正则表达式会被缓存,但是使用编译选项可以获得30%的运行时性能优势。究竟哪个更快取决于 - http://blogs.msdn.com/b/bclteam/archive/2010/06/25/optimizing-regular-expression-performance-part-i-working-with-the-regex-class-和-regex-objects.aspx - 但除非你的主题字符串非常大,我认为这是微不足道的差异。 – mikel 2010-11-22 09:44:47

0

正则表达式不会被缓存。每次您明确创建新实例或致电Regex.Replace时,都会创建新实例。如果标志包括RegexOptions.Compiled,则每次都编译它。

因此,您提供的代码将会很慢。为了获得最佳性能,如果多次使用正则表达式,则应该创建一次,然后重新使用。

Regex re = new Regex(@"\p{Z}", RegexOptions.Compiled); 
foreach (String StrTmp in SomeList) 
    re.Replace(StrTmp, ""); 
+3

如果使用静态方法,编译后的表达式将被缓存:为了消除重复编译单个正则表达式的需要,正则表达式引擎会缓存静态方法调用(http:// msdn)中使用的已编译正则表达式。 microsoft.com/en-us/library/6f7hht7k.aspx) – spender 2010-11-22 09:29:59

+0

@spender感谢您的信息!无论如何,最好不要依赖缓存,特别是在大型应用程序中。 – Athari 2010-11-22 09:46:32

1

Reffering到MSDN

在.NET Framework 1.0和1.1版,所有编译正则表达式,它们在实例或静态方法调用是否使用了缓存。从.NET Framework 2.0开始,只缓存静态方法调用中使用的正则表达式。

恕我直言,你甚至应该让你的类的私有成员和对象生命周期只有一次创建或使用静态调用(Regex.<something>),以便它被缓存。在第二种方法中,您应该注意MSDN这样说:

当您使用具有大量正则表达式的静态方法调用时。默认情况下,正则表达式引擎会缓存最近使用的15个静态正则表达式。如果您的应用程序使用超过15个静态正则表达式,则必须重新编译一些正则表达式。要防止此重新编译,可以将Regex.CacheSize属性增加到适当的值。

所以,如果你在对象(甚至是类)中用正则表达式实例优化速度使用方法,并且如果内存是你关心的问题,请使用静态方法调用。