Я вижу, что есть новый класс для регулярных выражений — QRegularExpression
. Это просто typedef для QRegExp, или новый класс, или что? А зачем он нам нужен, QRegExp у нас уже есть?
Есть ли разница между QRegularExpression и QRegExp?
Ответы (2)
Хорошо, еще немного покопавшись в документации, я обнаружил, что это действительно новый класс, в нем есть улучшения, но он доступен только в Qt5, поэтому вы не можете использовать его, если хотите компилировать как в Qt4, так и в Qt5:
Примечания для пользователей QRegExp
Класс QRegularExpression, представленный в Qt 5, является большим улучшением по сравнению с QRegExp с точки зрения предлагаемых API, поддерживаемого синтаксиса шаблонов и скорости выполнения. Самое большое отличие состоит в том, что QRegularExpression просто содержит регулярное выражение, и оно не изменяется при запросе совпадения. Вместо этого возвращается объект QRegularExpressionMatch, чтобы проверить результат совпадения и извлечь захваченную подстроку. То же самое относится к глобальному сопоставлению и QRegularExpressionMatchIterator.
По крайней мере для 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.