2010-11-04 55 views
1

在調用RegEx.Replace到大量字符串時,我有點擔心性能問題,因爲如果沒有匹配,我不知道它會發生什麼。如果什麼都不需要替換,C#/ .NET 2.0 RegEx.Replace是幹什麼的?

public static void ReplaceOldWithNew(ref string input) 
{ 
    string pattern = //something here 
    input = Regex.Replace(input, pattern, FormatReplacement); 
} 

private string FormatReplacement(Match m) 
{ 
    return String.Concat("x", formatCount++); 
} 

我應該有它這樣的

public static void ReplaceOldWithNew(ref string input) 
{ 
    string pattern = //something here 
    if (RegEx.IsMatch(input, pattern)) 
     input = Regex.Replace(input, pattern, FormatReplacement); 
} 

的問題,這是它搜索輸入字符串兩次,如果有匹配(ES)。是否有任何解決方案只會搜索一次匹配並僅在需要時才創建新的字符串實例。也許使用RegEx.Matches或其他。

感謝& BR - 馬蒂

回答

3

如果檢查Regex.ReplaceReflector它最終做到這一點內部:

Match match = regex.Match(input, startat); 
if (!match.Success) 
{ 
    return input; 
} 

換句話說,如果模式不匹配,將提前退出並返回原來的輸入。您的Regex.IsMatch用法正在做雙重工作,但它是預先知道匹配是否存在的唯一方法,因爲Regex.Replace返回的字符串不指示是否存在匹配。使用Match與循環或Matches不會讓您輕鬆重建原始字符串,因爲您需要計算匹配指數(使用Match上的Index屬性)並將它們組合在一起。

如果您希望使用正則表達式很多,您可以使用RegexOptions.Compiled選項進行研究。用你的代碼聲明你的Regex對象並重用它。您需要對此進行一些研究並基準評估它是否值得(即在任何地方使用該選項對於不需要它的場景來說都是過度的)。

+0

好的,再次感謝ahmad!不幸的是,我現在沒有時間進行這種研究。這足以讓我知道它早期返回並且不會創建例如StringBuilder並在那裏構造原始字符串。 – 2010-11-05 08:04:11

0

簡短的回答是,創建一個正則表達式對象,那麼當你做你的搜索,你就會有一個相匹配的集合,你可以打電話更換。類似這樣的:

var regex = new Regex(pattern, RegexOptions.Compiled); 
foreach (var currentMatch in regex.Matches) 
{ 
    //Do stuff 
} 

這樣,搜索只會執行一次,那麼只有在匹配時纔可以執行操作。

+0

感謝您的回答。雖然'不知道'怎麼做',但這並不能幫助我很多;)艾哈邁德的回答指出這不是世界上最簡單的事情...... – 2010-11-05 08:05:58

相關問題