【问题标题】:Is there any difference between QRegularExpression and QRegExp?QRegularExpression 和 QRegExp 之间有什么区别吗?
【发布时间】:2015-06-14 11:37:51
【问题描述】:

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

【问题讨论】:

    标签: c++ qt qt5 qregexp


    【解决方案1】:

    好的,在深入研究文档之后,我发现它确实是一个新类,它有改进,但它只在 Qt5 中可用,所以如果你想在 Qt4 和Qt5:

    QRegExp 用户注意事项

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

    【讨论】:

    • 是的,好吧,我花了一些时间尝试为 QRegularExpession 编写全面的文档,所以就是这样 :)
    • 我写了整堂课。如果您认为文档可以改进,请在错误报告中提交这样的建议。
    • "- 你写了文档的那部分?" “——我写了整堂课。”这让我哈哈大笑。
    • 感谢@peppe 编写整个课程和文档!话虽如此,我真的认为以下两个 URL 的第一行:doc.qt.io/qt-4.8/qregexp.html & doc.qt.io/qt-5/qregularexpression.html 应该说“请注意,Qt 中有两个正则表达式系统 [...]”
    • 好吧,QRegExp 文档中有一条注释说 QRegularExpression 是在 Qt 5 中使用的推荐类; OTOH QRegularExpression 文档广泛地处理了从 QRegExp 移植的问题。随时提交有关如何改进 Qt 的 bugtracker 措辞的建议。
    【解决方案2】:

    至少对于 Qt 4.8。我可以给出一个非常实际的理由来使用QRegularExpressions 而不是QRegExp

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

    int index = myQString.indexOf(myQRegExp);
    bool okay = myQString.contains(myQRegExp);
    

    这两行都可能损坏您的堆、崩溃或挂起您的应用程序。我经历了堆损坏并挂起 Qt 4.8。博文QString::indexOf() versus Qt 4.5 解释说QString::indexOf() 修改了const QRegExp 对象。 QString::contains() inlines QString::indexOf() 所以这是同样的问题。

    如果你被 Qt4 和 QRegExp 困住,你可以使用

    int index = myQRegExp.indexIn(myQString);
    bool okay = (myQRegExp.indexIn(myQString) != -1); 
    

    改为在您的来源中。或者修补 Qt 源代码。

    【讨论】:

      猜你喜欢
      • 2013-09-13
      • 2017-04-05
      • 2014-09-18
      • 2011-05-23
      • 2011-02-15
      • 2011-11-27
      • 2022-01-18
      • 1970-01-01
      • 2015-03-30
      相关资源
      最近更新 更多