替换多个 `Match` 没有 `MatchEvaluator` 的限制

Posted

技术标签:

【中文标题】替换多个 `Match` 没有 `MatchEvaluator` 的限制【英文标题】:Replace multiple `Match`es without `MatchEvaluator`'s restrictions 【发布时间】:2021-10-18 22:46:43 【问题描述】:

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

它将它们替换为当月的mm 和当天的dd

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

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

它使用Regex.Matches(inputString, @"\d1,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&lt;Match, string&gt;

使用天真的方法,字符串中的索引在我第一次替换后更改,第二次替换失败。

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

我怎样才能做到这一点,以确保替换是基于它们在原始字符串中的索引而不是中间替换。

【问题讨论】:

我不知道关闭这个问题的动机是什么,但它与它被标记为重复的问题不同。 【参考方案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;

【讨论】:

以上是关于替换多个 `Match` 没有 `MatchEvaluator` 的限制的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript中字符串的match与replace方法

正则匹配指定字符之间的内容,并替换(多个匹配替换)

正则表达式的一些方法

js 截取或者替换字符串中的数字实现方法

python之正则表达式 | match | split | findall | sub替换 |

test,exec,match,replace方法区别 正则