代码之家  ›  专栏  ›  技术社区  ›  JohnFx

如何在c_中的regex replace操作中使用计算值?

  •  9
  • JohnFx  · 技术社区  · 15 年前

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

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

    例子:

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

    期望输出

    X - 3
    

    注: 这是一个非常做作/简化的例子来演示这个问题。我意识到对于这个例子,正则表达式不是实现这一点的理想方式。请相信我,答案的实际应用是一个更复杂的问题的一部分,这确实需要在这里使用regex替换。

    3 回复  |  直到 15 年前
        1
  •  9
  •   Amber    15 年前

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

    public string Replace(string, MatchEvaluator);
    

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

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

        2
  •  13
  •   Guffa    15 年前

    如果您使用的是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();
          }
       )
    );
    
        3
  •  3
  •   NickAldwin    15 年前

    尝试

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

    下面的MatchEvaluator示例

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

    (有一部分是从正则表达式食谱中偷来的——我的圣经哈哈)