首页 文章

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

提问于
浏览
0

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

这是我的正则表达式:

@"(?:(?: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)";

目前,正则表达式在句子中的任何位置提取时间时都能很好地工作,但只有当它位于句子的开头时才提取日期 . 此外,如果句子中有第二个日期,则正则表达式不会对其进行确认,但如果在文本与日期旁边的文本匹配之后直接存在文本 .

例如:

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.

正则表达式应该匹配:

1) 31/07/2019

2) 3:00 PM

3) 03/08/2019

4) 12:00 PM

Note: 应该从句子的任何部分提取预期的输出(Beginning,Middle,End)

1 回答

  • 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 .

相关问题