QRegularExpression和QRegExp之间有什么区别吗?

sas*_*alm 35 c++ qt qregexp qt5

我看到正则表达式有一个新类 - QRegularExpression.它只是QRegExp的typedef,还是新类,还是什么?为什么我们需要它,我们已经有了QRegExp?

sas*_*alm 42

好的,经过一些深入研究文档,我发现它确实是一个新类,它有改进,但它只在Qt5中可用,所以如果你想在Qt4和Qt5上编译你就不能使用它:

QRegExp用户注意事项

Qt 5中引入的QRegularExpression类是QRegExp的一个重大改进,提供的API,支持的模式语法和执行速度.最大的区别是QRegularExpression只保存一个正则表达式,并且在请求匹配时不会修改它.而是返回一个QRegularExpressionMatch对象,以便检查匹配的结果并提取捕获的子字符串.这同样适用于全局匹配和QRegularExpressionMatchIterator.

  • 我写了整个班级.如果您认为文档可以改进,请在bug报告上提交这样的建议. (21认同)
  • " - 你写了那部分文档?" " - 我写了全班." 这让我大笑. (15认同)
  • 是的,我花了一些时间尝试编写有关QRegularExpession的全面文档,因此:) (3认同)
  • 感谢@peppe编写了整个课程和文档!这么说来就好,我真的认为以下两个URL的第一行:http://doc.qt.io/qt-4.8/qregexp.html和http://doc.qt.io/qt-5/ qregularexpression.html应该说“请注意,Qt [...]中有两个正则表达式系统”。 (2认同)

Sas*_*cha 9

至少对于 Qt 4.8 来说是这样。我可以给出一个非常实际的理由来QRegularExpressions代替QRegExp

这些对你来说看起来危险吗?

int index = myQString.indexOf(myQRegExp);
bool okay = myQString.contains(myQRegExp);
Run Code Online (Sandbox Code Playgroud)

这两行代码都可能会损坏您的堆、使您的应用程序崩溃或挂起。我在 Qt 4.8 中经历了堆损坏和挂起。博客文章QString::indexOf() 与 Qt 4.5解释了QString::indexOf()修改const QRegExp对象。QString::contains()内联QString::indexOf()所以这是同样的问题。

如果您受困于 Qt4 和 QRegExp,您可以使用

int index = myQRegExp.indexIn(myQString);
bool okay = (myQRegExp.indexIn(myQString) != -1); 
Run Code Online (Sandbox Code Playgroud)

相反,在您的来源中。或者修补 Qt 源。