我正在尝试匹配可以包含平衡<
和>
字符的C ++参数类型。
这个正则表达式:
(\<(?>[^<>]|(?R))*\>)
在此字符串上:QMap<QgsFeatureId, QPair<QMap<Something, Complex> >>
匹配所有期望前4个字符(QMap)。
现在,如果我在正则表达式的开头添加\w+
,它现在只匹配它的结尾(QPair<QMap<Something, Complex> >>
)而不是整个字符串。
解释是什么以及如何解决这个问题?
您可以在线试用here。
这是用于Perl 5.10+(5.24)。
答案 0 :(得分:4)
(?R)
construct递归整个模式。当您在开始时添加\w+
时,也会在递归发生时进行说明。但是,您要递归的是Group 1子模式。
您需要subroutine call来递归捕获组子模式:
(\w+)(<(?:[^<>]++|(?2))*>)
请参阅regex demo
<强>详情
(\w+)
- 第1组捕获标识符(您可以将其更改为[a-zA-Z]\w*
)(<(?:[^<>]++|(?2))*>)
- 第2组(将被递归)
<
- 文字<
(?:[^<>]++|(?2))*
- 除了<
和>
之外的1个字符(占有率,使其更快)或(|
)整个第2组模式({{ 1}})。(?2)
- 文字>
结果:
>