讀古今文學網 > 精通正則表達式(第3版) > 靜態「便捷」函數 >

靜態「便捷」函數

Static"Convenience"Functions

在第413頁的「正則表達式快速入門」中已經看到,我們並不需要每次都顯式地創建Regex對象。我們可以通過下面的靜態函數直接使用正則表達式:

其實它們不過是包裝了已經介紹的主要的 Regex構造函數和方法而已。它們會臨時創建一個Regex對象,用它來調用請求的方法,然後棄用這個對象(其實並沒有棄用,稍後介紹)這裡有個例子:

它等價於:

或者,更確切地說是:

使用這些便捷函數的好處在於,代碼因此更清晰易懂。面向對像式處理看起來像函數式處理(☞95),壞處在於每次調用都必須重新檢查pattern字符串。

如果在整個程序的執行過程中,正則表達式只用到 1 次,就不需要考慮便捷函數的效率問題。但是,如果需要應用多次(例如在循環中,或者是頻繁調用的函數中),每次準備正則表達式都需要代價(☞241)。創建 Regex 對象,然後重複使用的主要原因之一就是,使用便捷函數的效率太低。不過,下一節將告訴我們,.NET提供了一種很好的解決辦法:兼具面向對象的效率和函數式處理的便捷。

正則表達式緩存

Regex Caching

為簡單的正則表達式構建並管理Regex對像很不方便,所以.NET的正則包提供了各種靜態方法。但這些靜態方法存在效率缺陷,即每次調用都需要創建臨時的Regex對象,應用它,然後棄用。如果在循環中需要多次應用同樣的正則表達式,就需要進行許多不必要的工作。

為了避免重複的工作,.NET Framework能夠緩存靜態方法創建的臨時變量。第6章已經大致介紹過緩存(☞244),簡單地說,緩存的意思就是如果你希望在靜態方法中使用「最近」使用過的正則表達式,此方法就會重用之前創建的正則對象,而不是重新創建一個新對象。

「最近」的默認意義是緩存 15 個正則表達式。如果循環中使用的正則表達式超過15 個,則第16個正則表達式會取代第1個,所以進入下一輪循環時,第一個正則表達式已經不在緩存中,必須重新生成。

如果默認值15太小,可以這樣調整:

Regex.CacheSize=123

如果希望禁用緩存,可以將其設置為0。