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

Joh*_*nFx 9 c# regex

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

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

例:

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

期望的输出

X - 3
Run Code Online (Sandbox Code Playgroud)

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

Guf*_*ffa 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()
   )
);
Run Code Online (Sandbox Code Playgroud)

在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();
      }
   )
);
Run Code Online (Sandbox Code Playgroud)

  • 在C#4中,至少不需要创建一个`new MatchEvaluator`,可以直接使用lambda表达式. (2认同)

Amb*_*ber 9

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

public string Replace(string, MatchEvaluator);
Run Code Online (Sandbox Code Playgroud)

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

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