2010-11-22 66 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屬性增加到適當的值。

所以,如果你在對象(甚至是類)中用正則表達式實例優化速度使用方法,並且如果內存是你關心的問題,請使用靜態方法調用。