【发布时间】:2015-06-14 11:37:51
【问题描述】:
我看到有一个新的正则表达式类 - QRegularExpression。它只是 QRegExp 的 typedef,还是一个新类,还是什么?为什么我们需要它,我们已经有了 QRegExp?
【问题讨论】:
我看到有一个新的正则表达式类 - QRegularExpression。它只是 QRegExp 的 typedef,还是一个新类,还是什么?为什么我们需要它,我们已经有了 QRegExp?
【问题讨论】:
好的,在深入研究文档之后,我发现它确实是一个新类,它有改进,但它只在 Qt5 中可用,所以如果你想在 Qt4 和Qt5:
QRegExp 用户注意事项
Qt 5 中引入的 QRegularExpression 类在提供的 API、支持的模式语法和执行速度方面是对 QRegExp 的重大改进。最大的不同是 QRegularExpression 只保存一个正则表达式,在请求匹配时不会修改。相反,返回一个 QRegularExpressionMatch 对象,以检查匹配结果并提取捕获的子字符串。这同样适用于全局匹配和 QRegularExpressionMatchIterator。
【讨论】:
至少对于 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 源代码。
【讨论】: