2011-04-19 30 views
1

說我有一個正則表達式編譯對象:Regex.Replace和字符串不變性

 public static Regex myRgx = new Regex(@"[\d]+",RegexOptions.Compiled);

現在讓我們說我讀大串入字符串變量SS,然後我用我的正則表達式對象,以取代所有比賽該字符串中

 myRgx.Replace(SS,"($&)");

問:是否.Replace內部使用StringBuilder做的工作,就像在String.ReplaceAll會發生什麼()?
如果它不是有辦法解決這個問題?
更新:
我不知道是否可以問另一個問題作爲原始問題的更新..如果它不正確,請隨時編輯它。
問題2:如果我需要更換瓶坯的鏈條,使用多個regex對象,如:

string input = "Some LARGE string"; 
input = rgx1.Replace(input,"substitution1"); 
input = rgx2.Replace(input,"substitution2"); 
input = rgx3.Replace(input,"substitution3"); 

我正在寫一個形態分析,所以regex對象必須保持獨立,而需要按照上面的代碼以某種順序進行替換。正則表達式對象的數量很大,我們正在談論千兆字節的文本,所以每當一個正則表達式對象被替換時傳遞一個新的字符串對象,在這裏不是一個真正的選擇。
有何建議?

+2

它必須是一個相當枯燥的大字符串,擔心良好使用的框架函數的內部性能影響。 – Reddog 2011-04-19 18:13:56

回答

2

是的,Regex.Replace方法使用StringBuilder,如通過反射器發現的。

1

請放心,正則表達式庫在這裏做正確的事情。 不是使用StringBuilder或內部等價物不會有任何合理的權衡。

因此,Regex.Replace肯定會在這裏使用漸近有效的方法。

2

Regex.Replace()不會更改您的字符串SS。它會返回一個全新的字符串,並將其替換。

0

是的。 Regex內部使用StringBuilder所以它是優化

2

替換不會修改您的字符串,但創建一個新的請求修改。其他一切都是實現細節,你不應該關心。如果你不信任正則表達式庫,請不要使用它。即使它現在按照您的意願行事,它可能會在未來的情況下發生變化,恕不另行通知。

2

找到一個好帖子,討論various replace methods的細節。性能似乎因使用情況而異。對於簡單替換正則表達式速度較慢,但​​使用的內存少得多,創建的對象數量少,需要垃圾回收。