递归正则表达式的意外行为

时间:2017-03-30 06:30:09

标签: regex perl regex-recursion

我正在尝试匹配可以包含平衡<>字符的C ++参数类型。

这个正则表达式: (\<(?>[^<>]|(?R))*\>)

在此字符串上:QMap<QgsFeatureId, QPair<QMap<Something, Complex> >>

匹配所有期望前4个字符(QMap)。

现在,如果我在正则表达式的开头添加\w+,它现在只匹配它的结尾(QPair<QMap<Something, Complex> >>)而不是整个字符串。

解释是什么以及如何解决这个问题?

您可以在线试用here

这是用于Perl 5.10+(5.24)。

1 个答案:

答案 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) - 文字>

结果:

>