你有3種選擇:
這樣做是用繩子一個低效的方式,正如其他人推薦這裏。
使用.Matches()
呼叫您的Regex
對象,並模擬.Replace()
的工作方式(請參閱#3)。
適應單執行Regex
建立一個Regex
接受StringBuilder
(並請在這裏分享吧!),幾乎所有的工作都已經爲你單做,但它需要時間來蘇斯出來的零件是使其工作到自己的圖書館。 Mono的Regex
充分利用了Novell 2002年的JVM實現Regex
。
在單聲道:
System.Text.RegularExpressions.Regex
使用一個RxCompiler
在RxInterpreterFactory
的形式,其意料之中使得IMachine
S作爲RxInterpreter
s至實例化一個IMachineFactory。讓它們發出是你需要做的大部分事情,但是如果你只是想了解它的結構是如何提高效率的,那麼你要找的很多東西都在它的基類BaseMachine
中。
特別是,在BaseMachine
是基於StringBuilder
的東西。在方法LTRReplace
中,它首先使用初始字符串實例化一個StringBuilder,從此開始的所有內容純粹是基於StringBuilder的。實際上,如果我們假設內部Microsoft .Net實現類似,那麼Regex沒有將StringBuilder方法放在外面,這實際上很煩人。
盤旋迴建議2,你可以通過調用.Matches()
,跟蹤您身在何處原始字符串和循環模仿LTRReplace
的行爲:
var matches = regex.Matches(original);
var sb = new StringBuilder(original.Length);
int pos = 0; // position in original string
foreach(var match in matches)
{
sb.Append(original.Substring(pos, match.Index)); // Append the portion of the original we skipped
pos = match.Index;
// Make any operations you like on the match result, like your own custom Replace, or even run another Regex
pos += match.Value.Length;
}
sb.Append(original.Substring(pos, original.Length - 1));
但是,這不僅節省了你一些字符串 - 的mod-Mono方法是唯一真正做到這一點的人。
我很驚訝我沒有想到這個:實際運行它,看看,而不是猜測速度會是什麼。我相應地刪除了我的推測性答案。 – Timwi 2010-08-17 16:53:04
如果Regex.Replace足夠快,我是否應該對內存管理給予任何關注?我是否在分析/優化內容時擔心存儲空間不足以創建多個字符串? – ipr101 2010-08-17 17:38:29
這不是一個答案,而是一個建議。問題是如何讓正則表達式使用stringbuilder工作,答案是它們不兼容,除非你編寫自己的實現。爲什麼這是我不知道的情況。 – Slight 2015-06-01 14:11:30