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

时间:2012-10-22 06:35:47

标签: c# regex

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

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]
}

6 个答案:

答案 0 :(得分:10)

这应该这样做:

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());
}

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

编辑:虽然以上是您编写的问题的答案,但您可能会发现零宽度外观更适合您的实际情况:

Regex.Replace(input, @"(?<=e)l+(?=o)", replacement)

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

答案 1 :(得分: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);
    }

答案 2 :(得分:4)

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

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

我在stackoverflow中发现了一个与此相关的帖子:watch This

答案 3 :(得分:2)

Regex.Replace将始终替换所提供的正则表达式匹配的所有内容。

您有两种可能性:

  1. 仅匹配您要替换的内容

  2. 使用捕获组将已匹配但应保留的原始字符串部分插入替换字符串中。

  3. 您提供的信息不足以更具体地回答您的问题。例如。你真的需要MatchEvaluator吗?如果您想为每场比赛提供单独的替换字符串,则仅需要这样做。

答案 4 :(得分:0)

array.map {|e| e ? e : "0"}

答案 5 :(得分:0)

以下代码将匹配并根据groupValues集合构造替换字符串。此集合指定了一个组索引以及用它替换它的值的文本。

与其他解决方案不同,它不要求整个匹配包含在组中,只需要包含在组中的匹配部分。

public static string ReplaceGroups(Match match, Dictionary<int, string> groupValues)
{
    StringBuilder result = new StringBuilder();

    int currentIndex = 0;
    int offset = 0;

    foreach (KeyValuePair<int, string> replaceGroup in groupValues.OrderBy(x => x.Key))
    {
        Group group = match.Groups[replaceGroup.Key];

        if (currentIndex < group.Index)
        {
            result.Append(match.Value.Substring(currentIndex, group.Index - match.Index - currentIndex));
        }

        result.Append(replaceGroup.Value);

        offset += replaceGroup.Value.Length - group.Length;
        currentIndex = group.Index - match.Index + group.Length;
    }

    return result.ToString();
}