1

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

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

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

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

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

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

你可以在这里在线尝试。

这是打算在 Perl 5.10+ (5.24) 中使用的。

4

1 回答 1

4

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

您需要一个将递归捕获组子模式的子例程调用

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

查看正则表达式演示

细节

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

结果:

Match:   QMap<QgsFeatureId, QPair<QMfap<Something, Complex> >>
Group 1: QMap
Group 2: <QgsFeatureId, QPair<QMfap<Something, Complex> >>
于 2017-03-30T06:36:42.620 回答