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

标签 c++ regex qt qregexp qregularexpression

粗略查看 QRegexp 的文档显示它支持反向引用,而 QRegularExpression没有提到它。这是值得注意的,因为没有反向引用的正则表达式匹配可以按线性时间缩放,而包含反向引用则按指数时间缩放(source [dead link]cached version)。

一个类似的 StackOverflow answer还提到主要区别在于执行速度。考虑到新的正则表达式类可以采用一种新的算法是合乎逻辑的,这将允许它在线性时间内进行搜索,但是,我对此没有直接的了解。新的QRegularExpression类中是否有与上述类似的差异?

最佳答案

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

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

这些变化中的 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)

关于c++ - QRegularExpression 是否删除了反向引用(因此搜索速度更快),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059446/

相关文章:

c++ - MFC 扩展库(GUI/控件)推荐

正则表达式,必须包含数字、1-5 个字符以及字母和数字

php - 在 PHP 中,如何在插入 MySQL 表之前转义字符串中的单引号?

user-interface - 完全在 QtScript 中创建 GUI 应用程序,您的意见是什么?

c++ - Qt: c++: 如何使用 QStringList 填充 QComboBox

c++ - 为嵌套容器制作模板函数

c++ - 能够返回不同类型的函数?

regex - 改进正则表达式以匹配包含至少有 N 个字母的字母数字单词的 url

c++ - Qt槽没有激活

c++ - 使用虚拟析构函数会使非虚拟函数进行 v 表查找吗?