C# 使用正则表达式从字符串中提取日期和时间

C# 使用正则表达式从字符串中提取日期和时间,c#,regex,C#,Regex,我正在开发一个正则表达式,它接受所有可能的日期和时间格式,以便从句子中提取它们 这是我的正则表达式: @"(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:1|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?

我正在开发一个正则表达式,它接受所有可能的日期和时间格式,以便从句子中提取它们

这是我的正则表达式:

@"(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:1|30)(\/|-|\.)(?:0?[1,3-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)(?:0?2|(?:Feb))\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})(?:[\D]*)(?<time>\d{1,2}\:\d{2}\s(?:A|P)M)";
正则表达式应该匹配:

1)
2019年7月31日

2)
下午3:00

3)
2019年8月3日

4)
12:00 PM


注意:应该从句子的任何部分(开始、中间、结束)提取预期的输出。

时间模式匹配各种类型的日期之前的正则表达式部分,并且必须在添加任何其他模式之前进行分组。也就是说,
(?DATE1\u模式| DATE2\u模式| DATEn\u模式)\D*(?TIME\u模式)

然后,只需匹配并访问命名组:

var s = "Meet me on 31/07/2019 at 3:00 PM to celebrate and then the meeting will be on 03/08/2019 at 12:00 PM.";
var pattern = @"(?<date>(?:(?:31([-/.])(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:1|30)([-/.])(?:0?[13-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:29([-/.])(?:0?2|Feb)\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:0?[1-9]|1\d|2[0-8])([-/.])(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))\D*(?<time>\d{1,2}:\d{2}\s[AP]M)";
var result = Regex.Matches(s, pattern);
foreach (Match m in result) {
    Console.WriteLine(m.Groups["date"].Value);
    Console.WriteLine(m.Groups["time"].Value);
}

这是。

您好,您不应该检查您的正则表达式中的日期是否有效。您将在正则表达式的外侧处理31/02,这将更容易。您有一些肯定会导致问题的
^
$
锚。除此之外,我还建议将交替的每一部分进行处理,使其工作起来,然后将较大的正则表达式拼凑在一起。“所有可能的日期和时间格式”,这是很有可能的。可以创建有效和无效格式的列表。然后逐案处理。@DragandDrop我无法分解我的代码并这样做,因为目前我的代码先匹配,然后提取匹配项。@TimBiegeleisen我为这段代码苦苦挣扎了几个星期,你帮了我大忙。我去掉了锚,代码正常了。非常感谢。
var s = "Meet me on 31/07/2019 at 3:00 PM to celebrate and then the meeting will be on 03/08/2019 at 12:00 PM.";
var pattern = @"(?<date>(?:(?:31([-/.])(?:0?[13578]|1[02]|(?:Jan|Mar|May|Jul|Aug|Oct|Dec)))\1|(?:(?:1|30)([-/.])(?:0?[13-9]|1[0-2]|(?:Jan|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec))\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})|(?:29([-/.])(?:0?2|Feb)\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))|(?:0?[1-9]|1\d|2[0-8])([-/.])(?:(?:0?[1-9]|(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep))|(?:1[0-2]|(?:Oct|Nov|Dec)))\4(?:(?:1[6-9]|[2-9]\d)?\d{2}))\D*(?<time>\d{1,2}:\d{2}\s[AP]M)";
var result = Regex.Matches(s, pattern);
foreach (Match m in result) {
    Console.WriteLine(m.Groups["date"].Value);
    Console.WriteLine(m.Groups["time"].Value);
}
31/07/2019
3:00 PM
03/08/2019
12:00 PM