替换多个 `Match` 没有 `MatchEvaluator` 的限制
Posted
技术标签:
【中文标题】替换多个 `Match` 没有 `MatchEvaluator` 的限制【英文标题】:Replace multiple `Match`es without `MatchEvaluator`'s restrictions 【发布时间】:2021-10-18 22:46:43 【问题描述】:我的应用程序在日期字符串中找到数字,例如 13/7/2019
或 7/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<Match, string>
。
使用天真的方法,字符串中的索引在我第一次替换后更改,第二次替换失败。
例如。 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方法