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

时间:2018-08-29 06:07:56

标签: c# regex

我正在研究一种正则表达式,它接受所有可能的日期和时间格式以从句子中提取它们。

这是我的正则表达式:

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.

当前,正则表达式在提取句子中任何位置的时间时都可以正常工作,但是仅在句子开头时才提取日期。 另外,如果句子中有第二个日期,则正则表达式不会确认它,但紧接在该日期之后的文本与该日期旁边的文本匹配。

例如:

31/07/2019

正则表达式应该匹配:

1)3:00 PM

2)03/08/2019

3)12:00 PM

4)#MyCarousel .carousel-item { transition: transform 1s ease-in-out; }

注意:预期输出应从句子的任何部分(开头,中间,结尾)中提取

1 个答案:

答案 0 :(得分:0)

\D* +时间模式之前的正则表达式部分与各种类型的日期匹配,并且必须进行分组,然后再添加其他任何模式。即(?<date>DATE1_PATTERN|DATE2_PATTERN|DATEn_PATTERN)\D*(?<time>TIME_PATTERN)

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

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);
}

请参见C# demo,输出:

31/07/2019
3:00 PM
03/08/2019
12:00 PM

这里是.NET regex fiddle