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

Unexpected behavior around recursive regex

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

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

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

它匹配除前 4 个字符之外的所有字符 (QMap)。

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

这是什么解释,如何解决?

你可以在线试一下here

这是为了在 Perl 5.10+ (5.24) 中使用。

(?R) construct 递归 整个 模式。当您在开头添加 \w+ 时,它也会在递归发生时被考虑在内。但是,您要递归的是 Group 1 子模式。

您需要一个 subroutine call 来递归捕获组子模式:

(\w+)(<(?:[^<>]++|(?2))*>)

regex demo

详情

  • (\w+) - 第 1 组捕获标识符(您可以将其更改为 [a-zA-Z]\w*
  • (<(?:[^<>]++|(?2))*>) - 第 2 组(将被递归)
    • < - 文字 <
    • (?:[^<>]++|(?2))* - 除 <> 之外的 1+ 个字符(自然地使其更快)或 (|) 整个第 2 组模式( (?2)).
    • > - 文字 >

结果:

Match:   QMap<QgsFeatureId, QPair<QMfap<Something, Complex> >>
Group 1: QMap
Group 2: <QgsFeatureId, QPair<QMfap<Something, Complex> >>