0

我有一个像

(任何文本)XX:XX AM - XX:XX PM(任何文本)

其中 X 是 0 到 9 之间的数字,数字可以是 1 或两个字符(例如:12:45 或 1:20)

我需要找到一个正则表达式来找到该模式之间的 - (破折号)。

我是新手,但这是我找到上述模式的简单正则表达式:

([\d]{1,2}:[\d]{1,2}|[\d]{1,2}:[\d]{1,2} [aApP][mM])(.*?)([\d]{1,2}:[\d]{1,2}|[\d]{1,2}:[\d]{1,2} [aApP][mM])

这并没有让我找到在模式中间找到破折号的最终目标。

4

3 回答 3

1

在这种情况下,积极的后视将是最短/最简单的正则表达式,但它并非无处不在,因此取决于您使用的语言/环境。

仅匹配-以下内容AM

(?<=AM )-

根据数据中误报的可能性,这可能需要加强,例如也HAM - CHEESE将匹配,因此使用积极的后视和前瞻:

(?<=:\d{2} AM )-(?= \d{1,2}:\d{2} PM)

?<=      # Positive look-behind 
:        # Match colon
\d{2}    # Followed by 2 digits (and a space)
AM       # Followed by AM (and a space)
-        # Match hyphen if look-behind is met
?=       # Positive look-ahead
 \d{1,2} # Match either 1 or 2 digits
:        # Followed by a colon 
\d       # Followed by 2 more digits 
 PM      # Finally a space and PM   

这应该排除任何误报。

演示grep

$ echo '(any text) XX:XX AM - XX:XX PM (any text)' | grep -Po '(?<=AM )-'
-

$ echo '12:45 AM - 1:20 PM' | grep -Po '(?<=:\d{2} AM )-(?= \d{1,2}:\d{2} PM)'
-

另一种选择是使用捕获组,以下regexp将匹配整行并且-将在捕获组 1 中匹配:

^.*\d{1,2}:\d{2}\sAM\s(-)\s\d{1,2}:\d{2}\sPM.*$
于 2012-12-14T23:35:42.017 回答
0

这将找到破折号:

(?i)(?<\d\d?:\d\d?\s*[ap]m\s*).*?(?=\s*\d\d?:\d\d?\s*[ap]m)

这使用环视,所以整个正则表达式只匹配连接字符

于 2012-12-14T23:34:02.953 回答
0
/\d\d:\d\d [ap]m (.) \d\d:\d\d [ap]m/i
于 2012-12-14T23:45:48.343 回答