Есть ли разница между QRegularExpression и QRegExp?

Я вижу, что есть новый класс для регулярных выражений - QRegularExpression, Это просто typedef для QRegExp, или новый класс, или что? И зачем нам это, у нас уже есть 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.

Другие вопросы по тегам