QRegularExpression 是否删除了反向引用(因此搜索速度更快)

Does QRegularExpression remove Backreferences (and faster searching as a result)

粗略查看 QRegexp shows that it supports backreferences, while QRegularExpression makes no mention of it. This would be notable since regular expression matching without backreferences can scale in linear time, while including backreferences scales as exponential time (source [dead link], cached version) 的文档。

类似的 Whosebug 也提到主要区别在于执行速度。考虑到新的正则表达式 class 可以采用一种新的算法,这将允许它在线性时间内进行搜索,这是合乎逻辑的,但是,我对此没有直接的了解。新的QRegularExpressionclass有没有和上面类似的区别?

QRegularExpression departs from the functionality of QRegExp 在 5 个特定区域:

  1. 支持 \A\z
  2. 支持全局匹配
  3. 移除通配符匹配
  4. 删除了对劣质正则表达式语法的支持(现在仅支持 Perl 兼容正则表达式 (PCRE))
  5. 添加了对 *?+? 修饰符的支持
  6. 删除了对无用 QRegExp::CaretModes 的支持,QRegExp::CaretAtOffset
  7. 除外

其中 4 与这个问题非常相关。 PCRE 是迄今为止最先进的正则表达式引擎。因此,它当然支持反向引用以及许多其他 QRegExp 永远无法企及的功能。

至于没有明确提及 PCRE 提供的每个功能背后的基本原理与 PCRE 是由 70k 字文档定义的事实有关。如果您有兴趣烧穿碳粉盒,QRegularExpression 直接链接到此页面:http://pcre.org/pcre.txt

顺便引用一下那本书,这些是 PCRE 支持的反向引用语法:

  • \n reference by number (can be ambiguous)
  • \gn reference by number
  • \g{n} reference by number
  • \g{-n} relative reference by number
  • \k<name> reference by name (Perl)
  • \k'name' reference by name (Perl)
  • \g{name} reference by name (Perl)
  • \k{name} reference by name (.NET)
  • (?P=name) reference by name (Python)