web-dev-qa-db-ja.com

QRegularExpressionとQRegExpの間に違いはありますか?

正規表現用の新しいクラスQRegularExpressionがあるようです。それはQRegExpのtypedefだけですか、それとも新しいクラスですか、それとも何ですか?そして、なぜそれが必要なのですか、すでにQRegExpを持っていますか?

38
sashoalm

さて、ドキュメントをさらに掘り下げた後、私はそれが本当に新しいクラスであることがわかりました、それは改善があります、しかしそれはQt5でしか利用できないので、Qt4とQt5の両方でコンパイルしたい場合はそれを使用できません:

QRegExpユーザー向けの注意事項

Qt 5で導入されたQRegularExpressionクラスは、提供されるAPI、サポートされるパターン構文、および実行速度の点でQRegExpを大幅に改善しています。最大の違いは、一致が要求されたときにQRegularExpressionが単純に正規表現および変更されないを保持することです。代わりに、一致の結果を確認し、キャプチャされた部分文字列を抽出するために、QRegularExpressionMatchオブジェクトが返されます。グローバルマッチングとQRegularExpressionMatchIteratorについても同様です。

45
sashoalm

少なくともQt 4.8では。 QRegularExpressionsの代わりにQRegExpを使用する非常に実用的な理由を説明できます。

これらはあなたにとって危険に見えますか?

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

どちらの行も、ヒープを破壊したり、アプリケーションをクラッシュまたはハングさせたりする可能性があります。ヒープの破損を経験し、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); 
_

代わりにあなたのソースで。または、Qtソースにパッチを適用します。

2
Sascha