假设我在C ++中使用regex.h尝试匹配以下表达式,并尝试获取包含的子表达式:
/^((1|2)|3) (1|2)$/
假设它与字符串“3 1”匹配,则子表达式为:
"3 1"
"3"
"1"
如果它与字符串“2 1”匹配,则子表达式为:
"2 1"
"2"
"2"
"1"
这意味着,根据第一个子表达式的计算方式,最后一个子表达式位于pmatch数组的不同元素中。我意识到这个特殊的例子是微不足道的,因为我可以删除其中一个括号,或者抓住数组的最后一个元素,但是在更复杂的表达式中会出现问题。
假设我想要的只是顶级子表达式,那些不是其他子表达式的子表达式。有没有办法只得到它们?或者,或者,知道在子表达式中匹配了多少个子表达式,这样我就可以遍历数组而不管它如何计算?
由于
答案 0 :(得分:3)
解决此问题有两种常用方法:
(?P<name>)
,因此您可以按名称明确提取捕获的组。 (?: blah)
,以便该组不会成为生成的组列表的一部分,其余组将保持预期的顺序。目前还不清楚你正在使用哪种正则表达方言,所以我不知道它是否支持这两种方法,但请查看this regex comparison chart。
将(1 | 2)组转换为非捕获组将如下所示:
/^((?:1|2)|3) (1|2)$/
答案 1 :(得分:1)
我不知道regex.h
,但在许多正则表达式库中,您可以通过使用?:
启动组来使用非捕获括号,这样就可以阻止内部组成为索引子表达式:
/^((?:1|2)|3) (1|2)$/