带有可选捕获组的正则表达式

时间:2018-03-07 14:24:40

标签: regex capture-group

我正在尝试使用正则表达式从字符串中获取ammount,unit和substance。单位和物质来自预定义的列表。

所以:

  • " 2公斤水"应该返回:2, kg, water
  • " 1加仑原油"应该返回:1, gallon, oil

我可以使用以下正则表达式实现此目的:     (\d*) ?(kg|ml|gallon).*(water|oil)

问题在于我无法弄清楚如何使最后一个捕获组成为可选项。如果物质不在预定义列表中,我仍然想要获得ammount和unit。所以:

  • " 1加仑柴油"应该返回:1, gallon1, gallon, ''

我已经尝试将最后一个组包装在可选的非捕获组中,如下所述:Regex with optional capture fields但没有成功。

以下是te在线正则表达式测试器中的当前值:https://regex101.com/r/hV3wQ3/55

1 个答案:

答案 0 :(得分:3)

您正在尝试使用(\d+) ?(kg|ml|gallon).*(?:(water|oil))?,此模式无法捕获water / oil。问题是.*除了换行符之外的任何0+字符,直到字符串/行的末尾,并且当正则表达式索引在字符串末尾时尝试(?:(water|oil))?。由于(?:(water|oil))?可以匹配空字符串,因此它匹配字符串末尾的位置,并返回匹配。

您仍然可以使用捕获组作为强制性,但使用可选的非捕获组包装.*和捕获组:

(\d+) ?(kg|ml|gallon)(?:.*(water|oil))?
                     ^^^             ^^ 

请参阅regex demo

(?:.*(water|oil))?匹配除了换行符(.*)之外的任何0+字符的1或0(贪婪)次数,然后是wateroil。< / p>