正则表达式与最后一个可选组不匹配

问题描述 投票:0回答:1

我正在尝试检测文本中的时间。一切工作正常,除了最后一组是可选的。如果我删除

?
符号,它适用于该示例。

这是我的正则表达式:

^.*?(stell)?.*?(weck).*?(mich)?.*?((\d\d?).*?uhr(.*?(\d\d?))?|(\d\d?)\s*?(stunde|minute).*?((\d\d?)\s*?minute)?).*?$

这是我的例子:

weck mich um 2 uhr
wecke mich in 2 stunden
wecke mich um 15 uhr 13ojhwk
wecke mich in 5 minuten
stelle einen wecker für 5 minuten
stelle einen wecker in 5 stunden
stelle einen wecker für 12 stunden und 10 minuten lksdjglk
stelle einen wecker für 12 minute und 10 minuten lksdjglk

enter image description here

在这里您可以看到,正则表达式在最后两个示例中与

10 minute
的组不匹配。是否可以告诉
?
它应该更喜欢结果(如果有)? (解释有点奇怪)

regex
1个回答
1
投票

用可选的非捕获组包裹

.*?((\d\d?)\s*?minute)?
部分,
(?:.*?((\d\d?)\s*?minute))?

^.*?(stell)?.*?(weck).*?(mich)?.*?((\d\d?).*?uhr(.*?(\d\d?))?|(\d\d?)\s*?(stunde|minute)(?:.*?((\d\d?)\s*?minute))?).*$

请参阅 正则表达式演示

关键是

((\d\d?)\s*?minute)
组在那里成为强制性的,并且正则表达式引擎由于应用于该可选组的贪婪
?
量词,希望在
stunde
minute
(之前的强制性组),所以它不能跳过它。

© www.soinside.com 2019 - 2024. All rights reserved.