如何从正则表达式中检索匹配的层次结构

时间:2016-05-13 21:50:51

标签: regex c++11

std::regex  r("((.)(.))(.)");

在三个字母的字符串上运行它只会返回5个匹配项。 Coliru

相反,我想找回两个" toplevel"匹配,其中第一个匹配包含两个子匹配。我希望能够将它们嵌套到任何深度并找回合适的匹配树。

似乎boost与"nested matches"有类似的结果。它是否正确?我可以在没有提升的情况下在c ++ 11中执行此操作吗?

额外:一个稍微不那么琐碎的玩具示例,这可能有用:

((,[0-9]+)+)((,[a-z])+)

这将匹配一系列数字,后跟一系列单词,全部用逗号分隔。我想将数字匹配与单词匹配分开,而不是使用一系列平面匹配。

1 个答案:

答案 0 :(得分:0)

关于正则表达式的事情是它们不是递归下降解析器。但是你可以结合使用正则表达式和C ++(或任何其他语言)。

请注意,此正则表达式存在一些问题:

((,[0-9]+)+)((,[a-z])+)

为了不错过匹配第一项,列表必须以,开头。另一个问题是你也只能抓住小写的1个字母的单词。

为了简单起见,我将通过假设您为每个字符串添加,作为前缀来解决第一个问题。第二个问题可以通过改变正则表达式来解决:

((,[0-9]+)+)((,[a-zA-Z]+)+)

请注意,这不会捕获多组数字,后跟一组单词。为此,你必须在循环中搜索,如评论所述。

现在已经解决了,我可以解释一下你如何实现自己想要的目标。

所有数字匹配都在matches[1]。所有字母匹配都在matches[3]

您可以通过拆分,来获取数字列表中的每个项目。字母列表也是如此。