QRegularExpression 和 QRegExp 之间有什么区别吗?
Is there any difference between QRegularExpression and QRegExp?
我看到有一个新的正则表达式 class - QRegularExpression
。它只是 QRegExp 的 typedef,还是新的 class,还是什么?为什么我们需要它,我们已经有了 QRegExp?
好的,在深入研究文档后,我发现它确实是一个新的class,它有改进,但它只在 Qt5 中可用,所以你不能使用它在 Qt4 和 Qt5 上编译:
Notes for QRegExp Users
The QRegularExpression class introduced in Qt 5 is a big improvement upon QRegExp, in terms of APIs offered, supported pattern syntax and speed of execution. The biggest difference is that QRegularExpression simply holds a regular expression, and it's not modified when a match is requested. Instead, a QRegularExpressionMatch object is returned, in order to check the result of a match and extract the captured substring. The same applies with global matching and QRegularExpressionMatchIterator.
至少对于 Qt 4.8。我可以给出一个非常实际的理由来使用 QRegularExpressions
而不是 QRegExp
:
你觉得这些危险吗?
int index = myQString.indexOf(myQRegExp);
bool okay = myQString.contains(myQRegExp);
这两行都可能破坏您的堆、崩溃或挂起您的应用程序。我经历了堆损坏并挂起 Qt 4.8。博客 post QString::indexOf() versus Qt 4.5 解释说 QString::indexOf()
修改了 const QRegExp
对象。 QString::contains()
内联 QString::indexOf()
所以这是同样的问题。
如果您受困于 Qt4 和 QRegExp,您可以使用
int index = myQRegExp.indexIn(myQString);
bool okay = (myQRegExp.indexIn(myQString) != -1);
改为在您的来源中。或者修补 Qt 源代码。
我看到有一个新的正则表达式 class - QRegularExpression
。它只是 QRegExp 的 typedef,还是新的 class,还是什么?为什么我们需要它,我们已经有了 QRegExp?
好的,在深入研究文档后,我发现它确实是一个新的class,它有改进,但它只在 Qt5 中可用,所以你不能使用它在 Qt4 和 Qt5 上编译:
Notes for QRegExp Users
The QRegularExpression class introduced in Qt 5 is a big improvement upon QRegExp, in terms of APIs offered, supported pattern syntax and speed of execution. The biggest difference is that QRegularExpression simply holds a regular expression, and it's not modified when a match is requested. Instead, a QRegularExpressionMatch object is returned, in order to check the result of a match and extract the captured substring. The same applies with global matching and QRegularExpressionMatchIterator.
至少对于 Qt 4.8。我可以给出一个非常实际的理由来使用 QRegularExpressions
而不是 QRegExp
:
你觉得这些危险吗?
int index = myQString.indexOf(myQRegExp);
bool okay = myQString.contains(myQRegExp);
这两行都可能破坏您的堆、崩溃或挂起您的应用程序。我经历了堆损坏并挂起 Qt 4.8。博客 post QString::indexOf() versus Qt 4.5 解释说 QString::indexOf()
修改了 const QRegExp
对象。 QString::contains()
内联 QString::indexOf()
所以这是同样的问题。
如果您受困于 Qt4 和 QRegExp,您可以使用
int index = myQRegExp.indexIn(myQString);
bool okay = (myQRegExp.indexIn(myQString) != -1);
改为在您的来源中。或者修补 Qt 源代码。