Regex 带有可选捕获组的正则表达式
我正在尝试使用正则表达式从字符串中获取数量、单位和物质。单位和物质来自预定义的列表 因此:Regex 带有可选捕获组的正则表达式,regex,capture-group,Regex,Capture Group,我正在尝试使用正则表达式从字符串中获取数量、单位和物质。单位和物质来自预定义的列表 因此: “2千克水”应返回:2千克水 “1加仑原油”应返回:1,加仑,油 我可以通过以下正则表达式实现这一点: (\d*)?(千克/毫升/加仑)。*(水/油) 问题是我不知道如何使最后一个捕获组成为可选的。如果物质不在预先定义的列表中,我仍然想得到数量和单位。因此: “1加仑柴油”应返回:1加仑或1加仑,“ 我已经尝试将最后一个组包装在一个可选的非捕获组中,如下所述:但没有成功 以下是te online
- “2千克水”应返回:
2千克水
- “1加仑原油”应返回:
1,加仑,油
(\d*)?(千克/毫升/加仑)。*(水/油)
问题是我不知道如何使最后一个捕获组成为可选的。如果物质不在预先定义的列表中,我仍然想得到数量和单位。因此:
- “1加仑柴油”应返回:
或1加仑
1加仑,“
以下是te online regex tester中的当前正则表达式:您正在尝试使用
(\d+)(kg | ml |加仑)。*(?:(水|油))?
,并且此模式无法捕获水
/油
。问题是*
会将除换行符以外的任何0+字符抓取到字符串/行的末尾,并且当正则表达式索引位于字符串末尾时,会尝试(?:(水|油))?
。由于(?:(水|油))?
可以匹配空字符串,因此它匹配字符串末尾的位置,并返回匹配
您仍然可以强制使用捕获组,但将*
和捕获组包装为可选的非捕获组:
(\d+) ?(kg|ml|gallon)(?:.*(water|oil))?
^^^ ^^
见
(?:.*(水|油))?
匹配除断线字符(*
)之外的任何0+字符的1或0次(贪婪地)匹配,然后是水
或油
为什么不直接捕获(.*)(\d+)(kg | ml |加仑)并在以后检查预定义物质列表?使用它在0到1次之间匹配的量词<代码>(水?油)?@S.Jovan这不起作用。它总是捕捉不到任何东西。很好,这很有魅力。我明白了。但是我不明白为什么(\d+)(?:(水油))不起作用。为什么第3组的水和油不匹配?@JasperZelf,因为*
已经抓住了水或油,而且没有必要回溯,因为(…)?
匹配任何东西,即使是空字符串(位置)。这非常有意义。谢谢你的解释