9

C# 正規表現を使用してテキストを解析しています。試合ごとに特定のグループを 1 つだけ置き換えたい。ここで私はそれをやっています:

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

これはどう?

    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 に答える
5

使用できますMatchEvaluator: これを試してください。

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

これに関連するstackoverflowで1つの投稿を見つけました:これを見る

于 2012-10-22T06:51:32.887 に答える
2

Regex.Replace提供された正規表現が一致したすべてのものを常に置き換えます。

2つの可能性があります。

  1. 置き換えたいものだけを一致させます

    また

  2. キャプチャグループを使用して、一致したが保持する必要がある元の文字列の部分を置換文字列に挿入します。

あなたはあなたの質問にもっと具体的に答えるのに十分な情報を提供しませんでした。たとえば、本当に必要MatchEvaluatorですか?これは、一致ごとに個別の置換文字列を提供する場合にのみ必要です。

于 2012-10-22T06:57:30.377 に答える
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 に答える