我正在尝试检测文本中的时间。一切工作正常,除了最后一组是可选的。如果我删除
?
符号,它适用于该示例。
这是我的正则表达式:
^.*?(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
在这里您可以看到,正则表达式在最后两个示例中与
10 minute
的组不匹配。是否可以告诉?
它应该更喜欢结果(如果有)? (解释有点奇怪)
用可选的非捕获组包裹
.*?((\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
(之前的强制性组),所以它不能跳过它。