C#如何实现字符串中多个日期格式占位符的正确替换
问题原因
原有代码的逻辑缺陷非常明确:
- 仅通过
r.Match(input).Groups[1].Value提取了第一个占位符里的日期格式 - 后续调用全局
Replace时,把所有匹配到的{}占位符,都统一用这第一个格式生成的日期字符串替换
所以当存在多个不同格式的占位符时,后面的占位符会被错误替换成第一个格式对应的日期值,这就是{HH}位置也输出年月内容的根本原因。
修复代码
直接使用Regex.Replace的MatchEvaluator重载,对每一个匹配到的占位符单独提取格式、单独生成替换值即可。额外做了一处优化:统一只获取一次当前时间,避免替换过程中跨时间节点(比如跨分、跨秒)导致不同占位符取到的时间值不一致:
using System; using System.Text.RegularExpressions; public static string ReplaceDate(string input) { DateTime currentTime = DateTime.Now; Regex datePlaceholderRegex = new Regex(@"\{(.*?)\}"); return datePlaceholderRegex.Replace(input, match => { string dateFormatStr = match.Groups[1].Value; return currentTime.ToString(dateFormatStr); }); }
验证效果
- 单占位符输入
log_{yyyy-MM} foo.txt:输出符合预期,例如log_2024-05 foo.txt - 多占位符输入
log_{yyyy-MM} foo {HH}.txt:每个占位符独立按自身格式格式化,输出符合预期,例如log_2024-05 foo 15.txt
内容的提问来源于stack exchange,提问作者Ham Burg
相关产品推荐
相关产品推荐

