我正在尝试使用正则表达式从字符串中获取ammount,unit和substance。单位和物质来自预定义的列表。
所以:
2, kg, water
1, gallon, oil
我可以使用以下正则表达式实现此目的:
(\d*) ?(kg|ml|gallon).*(water|oil)
问题在于我无法弄清楚如何使最后一个捕获组成为可选项。如果物质不在预定义列表中,我仍然想要获得ammount和unit。所以:
1, gallon
或1, gallon, ''
我已经尝试将最后一个组包装在可选的非捕获组中,如下所述:Regex with optional capture fields但没有成功。
以下是te在线正则表达式测试器中的当前值:https://regex101.com/r/hV3wQ3/55
答案 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(贪婪)次数,然后是water
或oil
。< / p>