Есть ли разница между 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.