2009-08-10 58 views
7

我正在尋找一種方法來使用c#regex.replace函數替換表達式中的匹配組的長度。如何在C#中的RegEx替換操作中使用計算的值?

也就是說,我可以取代什麼?在下面的例子中獲得所需的輸出如下所示?

實施例:

val = Regex.Replace("xxx", @"(?<exes>x{1,6})", "${exes} - ???"); 

希望的輸出

X - 3 

注:這是一個極其做作/簡化例子來說明這個問題。我認識到這個例子的正則表達式不是這樣做的理想方式。請相信我,答案的真實世界應用是一個更復雜的問題的一部分,這需要在這裏使用RegEx替換。

回答

8

嘗試使用的Regex.Replace版本調用一個函數來確定替換文本應該是什麼:

public string Replace(string, MatchEvaluator); 

http://msdn.microsoft.com/en-us/library/aa332127(VS.71).aspx

的功能,可以再看看匹配文本(Match對象提供作爲評估函數的參數)並返回一個具有適當計算值的字符串。

+0

謝謝。我想我需要這樣做,但在我走下這條路之前,我只想看看是否有一個由replace識別的關鍵字,以使此操作更簡單。儘管如此,你已經得到了我的贊同,如果沒有人用簡單的方式迴應,我會接受這個答案。 – JohnFx 2009-08-10 19:41:27

3

嘗試

val = Regex.Replace("xxx", @"(?<exes>x{1,6})", new MatchEvaluator(ComputeReplacement)); 

下面

public String ComputeReplacement(Match matchResult) { 
    return matchResult.Value.Length.ToString(); 
} 

的MatchEvaluator例子(從正則表達式食譜部分被盜 - 我的聖經哈哈)

+0

當然這是一個非常簡單的例子 – NickAldwin 2009-08-10 19:40:22

13

如果您正在使用C#3你可以只需從lambda表達式創建一個MatchEvaluator:

string val = Regex.Replace(
    "xxx", 
    @"(?<exes>x{1,6})", 
    new MatchEvaluator(
     m => m.Groups["exes"].Value[0] + " - " + m.Groups["exes"].Value.Length.ToString() 
    ) 
); 

在C#2你可以使用委託:

string val = Regex.Replace(
    "xxx", 
    @"(?<exes>x{1,6})", 
    new MatchEvaluator(
     delegate(Match m) { 
     return m.Groups["exes"].Value[0] + " - " + m.Groups["exes"].Value.Length.ToString(); 
     } 
    ) 
); 
+2

在C#4中至少不需要創建一個新的MatchEvaluator,lambda表達式可以直接使用。 – Grastveit 2011-04-18 08:00:42

+0

string val = Regex.Replace( 「xxx」, @「(? x {1,6})」, m => m.Groups [「exes」]。Value [0] +「 - 」+ m.Groups [「exes」]。Value.Length.ToString() ); – 2016-01-10 00:53:52

相關問題