正则表达式中的递归不起作用

Recursion in regular expression is not working

我需要在这个表达式中分隔类型和参数:

tf->get_TextState()->set_TextMatrix(std::shared_ptr<DOM::Matrix>(new DOM::Matrix(m->get_M11(), -m->get_M12())));

我创建了以下正则表达式:

std::shared_ptr[ \t]*<(?'type'[A-Z,:,_,a-z,<,>]*){1}>[ \t]*\([ \t]*new[ \t]*(\k'type'){1}(?'args'.*)

结果是:

组"type":DOM::Matrix

组"args":(m->get_M11(), -m->get_M12())));

"args"组中的问题,因为我只需要:(m->get_M11(), -m->get_M12())

为此,我将 .* 更改为:\([^()]*+(?:(?R)[^()]*+)*+\)

这个表达式单独很好地适用于:(m->get_M11(), -m->get_M12()))); 预期结果:(m->get_M11(), -m->get_M12())

但是当我在整个模式中添加它时,即:

std::shared_ptr[ \t]*<(?'type'[A-Z,:,_,a-z,<,>]*){1}>[ \t]*\([ \t]*new[ \t]*(\k'type'){1}(?'args'\([^()]*+(?:(?R)[^()]*+)*+\))

它不匹配任何东西。 我做错了什么?

您只需要使用子例程调用来使用 (?&args) 递归 args 子模式,而不是 整个 模式((?R)递归整个模式!)。

使用

std::shared_ptr\h*<(?'type'[A-Z:_a-z<>]*)>\h*\(\h*new\h*\k'type'(?'args'\([^()]*+(?:(?&args)[^()]*+)*+\))

regex demo

请注意,我将 [ \t] 替换为 \h(它匹配水平空格)以缩短模式,删除了多余的 {1} 量词和组。

顺便说一句,这里有一个替代表达式可以做同样的事情:

std::shared_ptr\h*<(?'type'[A-Z:_a-z<>]*)>\h*\(\h*new\h*\k'type'(?'args'\((?>[^()]|(?&args))*\))

another demo