匹配具有特定条件的字符串中的日期和时间

Match date and time from string with specific conditions

问题: 有一长串文本,需要从中提取日期。但是,该字符串有多个日期,因此必须满足某些条件才能成功。

文中带日期片段的字符串如下:

洛杉矶 12/19/2018 11:39 AM 她
作为一个单元 1/18/2019 8:30 AM 4 1.

使用下面的正则表达式我可以匹配两个日期:

<cfset dates = reMatch("(\d+/\d+/\d+)([^\s]([ ]{1,}))((1[0-2]|0?[1-9]):([0-5][0-9]) ?([AaPp][Mm]))(?=([ ]{1,}))(?=[0-9])", text)>

匹配日期:
2018 年 12 月 19 日 11:39 上午
2019 年 1 月 18 日 8:30 上午

我正在尝试匹配日期和时间后跟一个或多个空格和一个或多个数字(仅限第二个实例),这将丢弃第一个实例并让我在一个快乐的地方。到目前为止,我已经尝试了以下代码,但它丢弃了两个日期,因此正则表达式的最后一块不太正确:

<cfset dates = reMatch("(\d+/\d+/\d+)([^\s]([ ]{1,}))((1[0-2]|0?[1-9]):([0-5][0-9]) ?([AaPp][Mm]))(?=([ ]{1,}))(?=[0-9])", text)>

非常感谢任何帮助!

这部分位于模式 (?=([ ]{1,}))(?=[0-9]) 的末尾,这是 2 个单独的断言,其中第一个断言 1 个或多个空格,第二个断言从当前位置直接向右的数字.

那永远不会是真的。

您可以做的是使用单个断言 (?= +\d),如果您不需要所有捕获组,则忽略它们以仅通过前瞻获得匹配。

使用不区分大小写的匹配(因为唯一的字符是 a pm 目前可以以任意组合匹配)

\b\d+/\d+/\d+ +(?:1[0-2]|0?[1-9]):[0-5][0-9] ?[ap]m(?= +\d)

Regex demo

请注意,这是一个广泛匹配 \d+/\d+/\d+,您也可以使用 at this page.

所示的模式对其进行优化

带有捕获组的版本:

(\d+/\d+/\d+) +((1[0-2]|0?[1-9]):([0-5][0-9]) ?([AaPp][Mm]))(?= +\d)

Regex demo