当前位置:  开发笔记 > 编程语言 > 正文

将时间戳与描述分组

如何解决《将时间戳与描述分组》经验,为你挑选了1个好方法。

我有使用时间表应用程序记录的任务数据.我正在尝试解析每个任务的休息时间.

附加到任务的示例中断字符串可能如下所示:

下午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.锚,前瞻/后方,令人困惑,我似乎无法做任何我想做的事情.不想成为编写正则表达式的专家,但我真的很想学习一些可以直接应用于我正在做的事情的新东西.



1> Wiktor Strib..:

您可以使用以下正则表达式:

(\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位数字,然后ap,然后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] + "

"; }
推荐阅读
mobiledu2402852413
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有