Benannte Gruppe in Regex durch Wert ersetzen

Benannte Gruppe in Regex durch Wert ersetzen

Ja, es ist möglich:

public static class RegexExtensions
{
    public static string Replace(this string input, Regex regex, string groupName, string replacement)
    {
        return regex.Replace(input, m =>
        {
            return ReplaceNamedGroup(input, groupName, replacement, m);
        });
    }

    private static string ReplaceNamedGroup(string input, string groupName, string replacement, Match m)
    {
        string capture = m.Value;
        capture = capture.Remove(m.Groups[groupName].Index - m.Index, m.Groups[groupName].Length);
        capture = capture.Insert(m.Groups[groupName].Index - m.Index, replacement);
        return capture;
    }
}

Verwendung:

Regex regex = new Regex("^(?<PREFIX>abc_)(?<ID>[0-9]+)(?<POSTFIX>_def)$");

string oldValue = "abc_123_def";
var result = oldValue.Replace(regex, "ID", "456");

Ergebnis ist:abc_456_def


Nein, es ist nicht möglich, einen regulären Ausdruck ohne Eingabe zu verwenden. Es muss etwas zum Arbeiten haben, das Muster darf dem Ergebnis keine Daten hinzufügen, alles muss aus der Eingabe oder der Ersetzung kommen.

Anstatt String.Format zu verwenden, können Sie einen Look Behind und einen Look Ahead verwenden, um den Teil zwischen "abc_" und "_def" anzugeben und ihn zu ersetzen:

string result = Regex.Replace(input, @"(?<=abc_)\d+(?=_def)", "999");

Es gab ein Problem in der Antwort von user1817787 und ich musste eine Änderung an ReplaceNamedGroup vornehmen funktionieren wie folgt.

private static string ReplaceNamedGroup(string input, string groupName, string replacement, Match m)
{
    string capture = m.Value;
    capture = capture.Remove(m.Groups[groupName].Index - m.Index, m.Groups[groupName].Length);
    capture = capture.Insert(m.Groups[groupName].Index - m.Index, replacement);
    return capture;
}