Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C#中的正则表达式替换操作中使用计算值?_C#_Regex - Fatal编程技术网

如何在C#中的正则表达式替换操作中使用计算值?

如何在C#中的正则表达式替换操作中使用计算值?,c#,regex,C#,Regex,我正在寻找一种方法,用c#regex.replace函数在replace表达式中使用匹配组的长度 也就是说,我可以替换什么???在下面的示例中使用,以获得如下所示的所需输出 示例: val = Regex.Replace("xxx", @"(?<exes>x{1,6})", "${exes} - ???"); X - 3 注意:这是一个非常精心设计/简化的示例来演示该问题。我意识到在这个例子中,正则表达式并不是实现这一点的理想方法。请相信我,答案的实际应用是一个更复杂问题的一部分

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

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

示例:

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

注意:这是一个非常精心设计/简化的示例来演示该问题。我意识到在这个例子中,正则表达式并不是实现这一点的理想方法。请相信我,答案的实际应用是一个更复杂问题的一部分,需要在此处使用正则表达式替换。

尝试使用调用函数来确定替换文本的
RegEx.replace

public string Replace(string, MatchEvaluator);

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

请重试

val = Regex.Replace("xxx", @"(?<exes>x{1,6})", new MatchEvaluator(ComputeReplacement));
(部分从正则表达式食谱中偷来——我的圣经哈哈)

如果您使用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()
   )
);
string val=Regex.Replace(
“xxx”,
@“(?{1,6})”,
新匹配评估器(
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();
      }
   )
);
string val=Regex.Replace(
“xxx”,
@“(?{1,6})”,
新匹配评估器(
代表(匹配m){
返回m.Groups[“exes”].Value[0]+“-”+m.Groups[“exes”].Value.Length.ToString();
}
)
);

谢谢。我在想我需要这样做,但在我走这条路之前,我只是想看看是否有一个关键字可以被replace识别,以简化这个操作。尽管如此,你还是得到了我的支持,如果没有人用速记的方式来回答,我会接受这个答案。在C#4中,至少创建一个
新的MatchEvaluator
,lambda表达式可以直接使用。string val=Regex.Replace(“xxx”,@“(?x{1,6})”,m=>m.Groups[“exes”]。Value[0]+“-”+m.Groups[“exes”].Value.Length.ToString());
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();
      }
   )
);