在c ++中从正则表达式中排除子表达式

时间:2010-06-13 04:44:45

标签: c++ regex

假设我在C ++中使用regex.h尝试匹配以下表达式,并尝试获取包含的子表达式:

/^((1|2)|3) (1|2)$/

假设它与字符串“3 1”匹配,则子表达式为:

"3 1"
"3"
"1"

如果它与字符串“2 1”匹配,则子表达式为:

"2 1"
"2"
"2"
"1"

这意味着,根据第一个子表达式的计算方式,最后一个子表达式位于pmatch数组的不同元素中。我意识到这个特殊的例子是微不足道的,因为我可以删除其中一个括号,或者抓住数组的最后一个元素,但是在更复杂的表达式中会出现问题。

假设我想要的只是顶级子表达式,那些不是其他子表达式的子表达式。有没有办法只得到它们?或者,或者,知道在子表达式中匹配了多少个子表达式,这样我就可以遍历数组而不管它如何计算?

由于

2 个答案:

答案 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)$/