粗略查看 QRegexp
的文档显示它支持反向引用,而 QRegularExpression
没有提到它。这是值得注意的,因为没有反向引用的正则表达式匹配可以按线性时间缩放,而包含反向引用则按指数时间缩放(source [dead link]、cached version)。
一个类似的 StackOverflow answer还提到主要区别在于执行速度。考虑到新的正则表达式类可以采用一种新的算法是合乎逻辑的,这将允许它在线性时间内进行搜索,但是,我对此没有直接的了解。新的QRegularExpression
类中是否有与上述类似的差异?
最佳答案
QRegularExpression
departs from the functionality of QRegExp
在 5 个特定领域:
- 支持
\A
和\z
- 支持全局匹配
- 去除通配符匹配
- 删除了对劣质正则表达式语法的支持(现在仅支持 Perl 兼容正则表达式 (PCRE))
- 添加了对
*?
的支持和+?
修饰词 - 删除了对无用
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/