如何在C#中的RegEx替换操作中使用计算值?

我正在寻找一种方法来使用c#regex.replace函数在replace表达式中使用匹配组的长度。

也就是说,我可以替换什么? 在下面的示例中,获得下面显示的所需输出?

例:

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

期望的输出

 X - 3 

注意:这是一个非常人为/简化的例子来certificate这个问题。 我意识到在这个例子中,正则表达式不是理想的做法。 请相信我,答案的真实世界应用是一个更复杂的问题的一部分,需要在这里使用RegEx替换。

尝试使用调用函数的Regex.Replace版本来确定替换文本应该是什么:

 public string Replace(string, MatchEvaluator); 

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

然后,该函数可以查看匹配的文本( Match对象作为评估器函数的参数提供)并返回具有正确计算值的字符串。

如果您使用的是C#3,则只需从lambda表达式创建一个MatchEvaluator:

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

在C#2中,您可以使用委托:

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

尝试

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

使用下面的MatchEvaluator示例

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

(从正则表达式菜谱中部分被盗 – 我的圣经哈哈)