求可匹配多格式日期时间的完整正则表达式
匹配多种日期时间格式的正则表达式需求
当前使用的正则表达式
public const string DateTimeRegex = @"\b(?<datetime>" + // Date part @"((" + @"(\d{1,2}[\/\-\.]\d{1,2}[\/\-\.]\d{2}(\d{2})?)" + @"|(\d{1,2}\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-zA-Z]*,?\s+\d{2}\d{2}?)" + @"|((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-zA-Z]*\s+\d{1,2},?\s+\d{2}\d{2}?)" + @"|(\d{4}\-\d{1,2}-\d{1,2})" + @")" + // Optional time part @"(" + @"[T\s]?\d{1,2}:\d{1,2}(:\d{1,2}(\.\d+)?)?(([AP]M)|([\+\-][12]?\d:\d{1,2})|Z)?" + @")?)" + @")\b";
现有问题
- 能匹配目标日期,但无法匹配对应的时间部分(仅少数情况可匹配),例如输入带AM/PM的日期时间时,仅能提取出日期部分,时间被遗漏
- 无法匹配
25-Dec-2022这类“日-月份缩写-年”格式的日期 - 单独用以下正则匹配时间部分可行,但合并后无法正确同时匹配日期和时间:
public const string DateTimeRegex2 = @"(\d{1,2}:\d{1,2}(:\d{1,2}(\.\d+)?)?(([AP]M)|([\+\-][12]?\d:\d{1,2})|Z)?)";
需要支持的目标格式
25-Dec-2022 25-Dec-2022 12:36 25-Dec-2022 12:36 PM 11/17/2022 11/17/2022 12:36 11/17/2022 12:36 PM 1/6/2023 1/6/2023 12:36 1/6/2023 12:36 PM 11/3/2022 11/3/2022 12:36 11/3/2022 12:36 PM December 10, 2022 December 10, 2022 12:36 December 10, 2022 12:36 PM January 5, 2023 January 5, 2023 12:36 January 5, 2023 12:36 PM
同时需要兼容其他常见的日期时间格式。
改进后的正则表达式
public const string DateTimeRegex = @"\b(?<datetime>" + // 可选的星期前缀 @"(([A-Za-z]+,?\s+)?)?" + // 日期部分:覆盖所有目标格式及常见格式 @"((" + // 日/月/年 或 日-月-年 或 日.月.年(支持2位/4位年) @"(\d{1,2}([\/\-\.])\d{1,2}\1\d{2}(\d{2})?)" + // 日-月份缩写-年(如25-Dec-2022) @"|(\d{1,2}-(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-zA-Z]*-\d{4})" + // 日 月份全称/缩写 年(如10 Dec 2022 或 10 December 2022) @"|(\d{1,2}\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-zA-Z]*,?\s+\d{2}\d{2}?)" + // 月份全称/缩写 日, 年(如Dec 10, 2022 或 December 10, 2022) @"|((Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)[a-zA-Z]*\s+\d{1,2},?\s+\d{2}\d{2}?)" + // 年-月-日(如2022-12-10) @"|(\d{4}\-\d{1,2}-\d{1,2})" + @")" + // 可选的时间部分:支持空格/T分隔,带秒、毫秒、AM/PM、时区 @"(\s+|T)\d{1,2}:\d{1,2}(:\d{1,2}(\.\d+)?)?\s*([AP]M)?(([\+\-][12]?\d:\d{1,2})|Z)?)" + @"?\b";
修改说明
- 添加了可选星期前缀的匹配,支持
Saturday, December 10, 2022这类带星期的格式 - 新增了日-月份缩写-年格式的匹配规则,覆盖
25-Dec-2022这类格式 - 调整了时间部分的分隔逻辑:将原有的
[T\s]?改为(\s+|T),确保日期和时间之间的空格(包括多个空格)能被正确识别 - 优化了AM/PM的匹配逻辑,允许时间和AM/PM之间有空格,解决原正则无法匹配
11:36 AM这类格式的问题 - 保留了原有的秒、毫秒、时区(Z/偏移量)匹配逻辑,兼容更多时间格式
内容的提问来源于stack exchange,提问作者Katana
相关产品推荐
相关产品推荐

