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

时间:2016-03-23 22:10:25

标签: regex pcre

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

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'.*)

结果是:

群组“类型”: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)[^()]*+)*+\))

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

1 个答案:

答案 0 :(得分:0)

您只需要使用子例程调用来递归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