正则表达式负面展望没有给出预期的结果

Regex negative look ahead not giving desired result

我有两个字符串,如下所示:

6015603 06/12/2017 06/12/2017 02:45:28 PM - BIL/001347764403/LOAN/NSP CR  20,000.00  8,381.002 S 6156702 06/12/2017 06/12/2017

6015603 06/12/2017 06/12/2017 - BIL/001347764403/LOAN/NSP CR  20,000.00  8,381.002 S 6156702 06/12/2017 06/12/2017

和如下正则表达式:

[0-9]+\s+[0-9]{2}[\/][0-9]{2}[\/][0-9]{4}\s+[0-9]{2}[\/][0-9]{2}[\/][0-9]{4}\s*(?![0-9]{2}[:][0-9]{2}[:][0-9]{2}\s*(AM|PM)).*?(?=([0-9]+\s*[0-9]{2}[\/][0-9]{2}[\/][0-9]{4}+\s+[0-9]{2}[\/][0-9]{2}[\/][0-9]{4})|\Z)

如你所见,我使用了负面展望来避免时间

(?![0-9]{2}[:][0-9]{2}[:][0-9]{2}\s*(AM|PM))

但是当我 运行 匹配两个字符串的模式匹配。我希望第一个字符串被忽略。我在做什么错了?

我得到了解决方案,我没有将 \s* 包括在负面展望中。包含它后它可以正常工作。

错误的是:

\s*(?![0-9]{2}[:][0-9]{2}[:][0-9]{2}\s*(AM|PM))

正确的是:

(?!\s*[0-9]{2}[:][0-9]{2}[:][0-9]{2}\s*(AM|PM))

我从以下线程中获取了答案参考:

您可以在匹配第一个日期后添加 (?!.*?\d{2}:\d{2}:\d{2}\s*[AP]M) 否定前瞻:

^\d+\s+\d{2}/\d{2}/\d{4}\s+\d{2}/\d{2}/\d{4}(?!.*?\d{2}:\d{2}:\d{2}\s*[AP]M).*?(?=(\d+\s*\d{2}/\d{2}/\d{4}\s+\d{2}/\d{2}/\d{4})|$)
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

参见regex demo

如果在第一个日期和任何 0+ 个字符之后,尽可能少的匹配 \d{2}:\d{2}:\d{2}\s*[AP]M 模式的时间子字符串,则前瞻将完全失败匹配。

我还添加了 string/line ^ 锚点的开头,将所有 [0-9] 替换为 \d (它更短), [\/]/(Java 中的正则表达式不使用正则表达式定界符,因此不需要转义 / 这不是特殊的正则表达式元字符),将 (AM|PM) 缩小为 [AP]M 以减少分组开销, 并将 \Z 替换为 $,但如果你的意思是字符串的结尾而不是一行,你可以使用你的 \Z 锚点。

请注意,在 Java 中,您需要转义上述字符串中的每个反斜杠。