我需要在此表达式中分隔类型和参数:
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)[^()]*+)*+\))
它不匹配任何东西。 我做错了什么?
答案 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