9

我正在使用 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]
}
4

6 回答 6

12

这应该这样做:

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

于 2012-10-22T07:28:49.260 回答
5

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

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

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

于 2012-10-22T06:51:32.887 回答
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);
    }
于 2012-10-22T06:55:39.750 回答
2

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

你有两种可能:

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

    或者

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

您提供的信息不足,无法更具体地回答您的问题。例如,你真的需要一个MatchEvaluator吗?仅当您想为每个匹配项提供单独的替换字符串时,才需要这样做。

于 2012-10-22T06:57:30.377 回答
0
    private string ReplaceText(string originalText)
    {
        string replacedText = null;

        Regex regEx = new Regex("[your expression here]");

        Match match = regEx.Match(originalText);

        if (match.Success)
        {
            Group matchGroup = match.Groups[2];

            //[first part of original string] + [replaced text] + [last part of original string]
            replacedText =
                $"{originalText.Substring(0, matchGroup.Index)}[Your replaced string here]{originalText.Substring(matchGroup.Index + matchGroup.Length)}";

        }
        else
            replacedText = originalText;

        return replacedText;
    }
于 2017-06-26T19:15:18.857 回答
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();
}
于 2017-07-20T00:03:13.927 回答