正则表达式中的递归不起作用
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)[^()]*+)*+\))
请注意,我将 [ \t]
替换为 \h
(它匹配水平空格)以缩短模式,删除了多余的 {1}
量词和组。
顺便说一句,这里有一个替代表达式可以做同样的事情:
std::shared_ptr\h*<(?'type'[A-Z:_a-z<>]*)>\h*\(\h*new\h*\k'type'(?'args'\((?>[^()]|(?&args))*\))
我需要在这个表达式中分隔类型和参数:
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)[^()]*+)*+\))
请注意,我将 [ \t]
替换为 \h
(它匹配水平空格)以缩短模式,删除了多余的 {1}
量词和组。
顺便说一句,这里有一个替代表达式可以做同样的事情:
std::shared_ptr\h*<(?'type'[A-Z:_a-z<>]*)>\h*\(\h*new\h*\k'type'(?'args'\((?>[^()]|(?&args))*\))