Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 带有可选捕获组的正则表达式_Regex_Capture Group - Fatal编程技术网

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,因为
*
已经抓住了
水或
油,而且没有必要回溯,因为
(…)?
匹配任何东西,即使是空字符串(位置)。这非常有意义。谢谢你的解释