我有使用时间表应用程序记录的任务数据.我正在尝试解析每个任务的休息时间.
附加到任务的示例中断字符串可能如下所示:
下午1:19 - 晚上10:33吃炸玉米饼10:35 pm - 11:38 pm 12:40 am - 1:24 am睡午觉
我需要将其分为带有相关描述的时间戳.以上内容应分组如下:
下午1:19 - 晚上10:33吃了炸玉米饼
下午10:35 - 晚上11:38
凌晨12:40 - 凌晨1:24小睡了
中断间隔的描述基本上可以包含任何字符或任何长度.某些间隔没有描述.
我认为正则表达式是获取一系列间隔及其描述的最简单方法(如果它们有一个).
到目前为止,我有:
\d{1,2}:\d{2}[ap]m\s–\s\d{1,2}:\d{2}[ap]m
其匹配的时间戳1:19pm – 10:33pm
,10:35pm – 11:38pm
以及12:40am – 1:24am
我使用JavaScript和匹配函数来解析这些数据.我想创建一个正则表达式,它将匹配时间戳及其后的所有内容,直到下一个时间戳.
我是正则表达式的初学者,所以对我很轻松.我已经在这里工作了几个小时,观看了几个视频,阅读了教程博客,并一直在尝试使用regex101.锚,前瞻/后方,令人困惑,我似乎无法做任何我想做的事情.不想成为编写正则表达式的专家,但我真的很想学习一些可以直接应用于我正在做的事情的新东西.
您可以使用以下正则表达式:
(\d{1,2}:\d{2}[ap]m\s*–\s*\d{1,2}:\d{2}[ap]m)(\D*(?:\d(?!\d?:\d{2}[ap]m\s)\D*)*)
请参阅正则表达式演示
您遇到的问题是匹配与特定模式不匹配的文本.这可以通过驯化贪婪令牌或展开循环技术来实现.后者是优选的,因为它涉及较少的回溯.我的正则表达式基于这种技术.
这是正则表达式的解释:
(\d{1,2}:\d{2}[ap]m\s*–\s*\d{1,2}:\d{2}[ap]m)
- 匹配和捕获到组#1时间段(我只是将外括号和*
量词添加到\s
类中) - 因为它是你的正则表达式,我不会详细介绍
(\D*(?:\d(?!\d?:\d{2}[ap]m\s)\D*)*)
- 这是一个展开的.*?(?=\d{1,2}:\d{2}[ap]m\s)
构造,匹配任何直到第一个\d{1,2}:\d{2}[ap]m\s
模式.它被放置在组#2中.
\D*
- 除数字以外的0个或更多字符
(?:\d(?!\d?:\d{2}[ap]m\s)\D*)*
- 0或更多序列...
\d(?!\d?:\d{2}[ap]m\s)
-一个数字(\d
即后面没有1或0位),接着用:
随后用2位数字,然后a
或p
,然后m
,再一空白
\D*
- 再次,0或更多字符以外的字符.
JS演示:
var re = /(\d{1,2}:\d{2}[ap]m\s*–\s*\d{1,2}:\d{2}[ap]m)(\D*(?:\d(?!\d?:\d{2}[ap]m\s)\D*)*)/ig;
var str = '1:19pm – 10:33pm ate tacos 10:35pm – 11:38pm 12:40am – 1:24am took a nap';
var m;
while ((m = re.exec(str)) !== null) {
document.getElementById("r").innerHTML += "Period: " + m[1] + "
";
document.getElementById("r").innerHTML += "Description: " + m[2] + "
";
}