替换多个“匹配”,而不受“MatchEvaluator”限制

Replace multiple `Match`es without `MatchEvaluator`'s restrictions

提问人:trinalbadger587 提问时间:8/17/2021 最后编辑:trinalbadger587 更新时间:8/18/2021 访问量:33

问:

我的应用程序在日期字符串中查找数字,例如或 .13/7/20197/13/2019

它用月份和日期替换它们。mmdd

如果只找到一个数字(例如),则应假定它一定是日期。6 July 2019

如果不是,那么数字将是日期,另一个数字将是月份。>12

它使用查找数字Regex.Matches(inputString, @"\d{1,2}")

查看比赛后,我有 2 个变量 ()。Match? monthMatch, dayMatch

然后我做了一个字典:

Dictionary<Match, string> matches = new();
if (monthMatch != null)
    matches.Add(monthMatch, "mm");
if (dayMatch != null)
    matches.Add(dayMath, "dd");

问题是我怎样才能替换我拥有的。Dictionary<Match, string>

使用朴素的方法,在我第一次替换后,字符串中的索引会更改,而第二次替换会惨遭失败。

例如。7/13/2019 -> dd/13/2019 -> ddmm3/2019

我怎样才能确保替换是根据它们在原始字符串中的索引而不是中间替换进行替换的。

C# 正则表达式 匹配

评论

0赞 trinalbadger587 8/18/2021
我不知道关闭这个问题的动机是什么,但它与它被标记为重复的问题不同。

答:

0赞 trinalbadger587 8/17/2021 #1

我的解决方案是按索引的降序对它们进行排序,以便对象的索引在每次替换后仍然有效。Match

public static string SafeSubstitution (string input, Dictionary<Match, string> substitutions)
{
    foreach (var (match, replaceWith) in substitutions.OrderByDescending(s => s.Key.Index))
    {
        string subResult = match.Result(replaceWith);
        input = string.Concat(input.Substring(0, match.Index), subResult, input.Substr(match.Index + match.Length));
    }
    return input;
}