web-dev-qa-db-fra.com

Y a-t-il une différence entre QRegularExpression et QRegExp?

Je vois qu'il y a une nouvelle classe pour les expressions régulières - QRegularExpression. Est-ce juste un typedef pour QRegExp, ou une nouvelle classe, ou quoi? Et pourquoi en avons-nous besoin, nous avons déjà QRegExp?

38
sashoalm

Ok, après avoir creusé un peu plus dans les documents, j'ai trouvé que c'était vraiment une nouvelle classe, elle a des améliorations, mais elle n'est disponible que dans Qt5, donc vous ne pouvez pas l'utiliser si vous voulez compiler sur Qt4 et Qt5:

Notes pour les utilisateurs QRegExp

La classe QRegularExpression introduite dans Qt 5 est une grande amélioration par rapport à QRegExp, en termes d'API proposées, de syntaxe de modèle prise en charge et de vitesse d'exécution. La plus grande différence est que QRegularExpression contient simplement une expression régulière, et elle n'est pas modifiée lorsqu'une correspondance est demandée. Au lieu de cela, un objet QRegularExpressionMatch est retourné, afin de vérifier le résultat d'une correspondance et d'extraire la sous-chaîne capturée. La même chose s'applique à la correspondance globale et à QRegularExpressionMatchIterator.

45
sashoalm

Au moins pour Qt 4.8. Je peux donner une raison très pratique d'utiliser QRegularExpressions au lieu de QRegExp:

Est-ce que cela vous semble dangereux?

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

Les deux lignes peuvent corrompre votre tas, planter ou bloquer votre application. J'ai rencontré une corruption de tas et bloqué avec Qt 4.8. Le billet de blog QString :: indexOf () versus Qt 4.5 explique que QString::indexOf() modifie un objet const QRegExp. QString::contains() inlines QString::indexOf() c'est donc le même problème.

Si vous êtes bloqué avec Qt4 et donc QRegExp, vous pouvez utiliser

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

dans vos sources à la place. Ou corrigez les sources Qt.

2
Sascha