首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用Regex从字符串中提取日期和时间

使用Regex从字符串中提取日期和时间
EN

Stack Overflow用户
提问于 2018-08-29 06:07:56
回答 1查看 574关注 0票数 0

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

这是我的Regex

代码语言:javascript
运行
复制
@"(?:(?: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)";

目前,正则表达式在提取句子中任何位置的时间时都能很好地工作,但只有在句子开头时才能提取日期。此外,如果句子中有第二个日期,则regex不承认它,但是如果在文本与日期旁边的文本匹配之后直接出现文本。

例如:

代码语言:javascript
运行
复制
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.

Regex应该匹配:

1) 31/07/2019

2) 3:00 PM

3) 03/08/2019

4) 12:00 PM

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

EN

回答 1

Stack Overflow用户

发布于 2018-08-30 09:27:47

\D* + time模式之前,regex部分匹配各种类型的日期,并且必须在添加要遵循的任何其他模式之前对其进行分组。就是,(?<date>DATE1_PATTERN|DATE2_PATTERN|DATEn_PATTERN)\D*(?<time>TIME_PATTERN)

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

代码语言:javascript
运行
复制
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#演示,输出:

代码语言:javascript
运行
复制
31/07/2019
3:00 PM
03/08/2019
12:00 PM

这是.NET正则琴

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52070511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档