正则表达式与上一个可选组

时间:2017-01-25 07:37:21

标签: regex

我试图用文字检测时间。一切都很好,除了最后一组是可选的。如果我删除? - 符号,则适用于该示例。

这是我的正则表达式:^.*?(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的组。有可能告诉?它应该更喜欢结果吗? (有点奇怪的解释)

1 个答案:

答案 0 :(得分: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))?).*$

请参阅regex demo

关键是((\d\d?)\s*?minute)组在那里成为强制性的,由于应用于该可选组的贪婪?量词,正则表达式引擎希望在stunde之后立即匹配它或minute(以前的强制性团体),所以不能跳过它。