我有一个类似
的模式(任何文字)XX:XX AM - XX:XX PM(任何文字)
其中X是0到9之间的数字,数字可以是1或2个字符(例如:12:45或1:20)
我需要找到一个正则表达式来找到该模式之间的 - (短划线字符)。
我是新手,但这是我用来查找上述模式的简单RegEx:
([\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])
这不能让我的最终目标只是在模式的中间找到破折号。
答案 0 :(得分:1)
Positive look-behind将是最短/最简单的正则表达式,但它并不支持所有地方,因此它将取决于您使用的语言/环境。
仅匹配-
后面的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.*$
答案 1 :(得分:0)
这将找到破折号:
(?i)(?<\d\d?:\d\d?\s*[ap]m\s*).*?(?=\s*\d\d?:\d\d?\s*[ap]m)
这使用环顾四周,所以整个正则表达式只匹配连接字符
答案 2 :(得分:0)
/\d\d:\d\d [ap]m (.) \d\d:\d\d [ap]m/i