C#中的正则表达式 - 我如何只替换Match中的一个特定组?

Ala*_*ano 8 c# regex

我正在使用C#regex解析文本.我想为每场比赛只替换一个特定组.我在这里是怎么做的:

void Replace(){
  string newText = Regex.Replace(File.ReadAllText(sourceFile), myRegex, Matcher, RegexOptions.Singleline);
  //.......   
}

void string Matcher(Match m){
  // how do I replace m.Groups[2] with "replacedText"?
  return ""; // I want to return m.Value with replaced m.Group[2]
}
Run Code Online (Sandbox Code Playgroud)

Jus*_*gan 11

这应该这样做:

string Matcher(Match m)
{
    if (m.Groups.Count < 3)
    {
        return m.Value;
    }

    return string.Join("",  m.Groups
                             .OfType<Group>() //for LINQ
                             .Select((g, i) => i == 2 ? "replacedText" : g.Value)
                             .Skip(1) //for Groups[0]
                             .ToArray());
}
Run Code Online (Sandbox Code Playgroud)

示例:http://rextester.com/DLGVPA38953

编辑:虽然以上是你的问题的答案,你可能会发现零宽度的外观更简单:

Regex.Replace(input, @"(?<=e)l+(?=o)", replacement)
Run Code Online (Sandbox Code Playgroud)

示例:http://rextester.com/SOWWS24307


Bha*_*tel 5

您可以使用MatchEvaluator:试试这个。

var replaced = Regex.Replace(text, pattern, m => m.Groups[1] + "AA" + m.Groups[3]);
Run Code Online (Sandbox Code Playgroud)

我在 stackoverflow 中找到了一篇与此相关的帖子:watch This

  • 但是OP已经有一个MatchEvaluator`void string Matcher(Match m){}` (2认同)

mlo*_*ske 5

这个怎么样?

    static string Matcher(Match m)
    {
        var group = m.Groups[2];
        var startIndex = group.Index - m.Index;
        var length = group.Length;
        var original = m.Value;
        var prior = original.Substring(0, startIndex);
        var trailing = original.Substring(startIndex + length);
        return string.Concat(prior, "replacedText", trailing);
    }
Run Code Online (Sandbox Code Playgroud)