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

Я вижу, что есть новый класс для регулярных выражений — QRegularExpression. Это просто typedef для QRegExp, или новый класс, или что? А зачем он нам нужен, QRegExp у нас уже есть?


person sashoalm    schedule 09.04.2015    source источник


Ответы (2)


Хорошо, еще немного покопавшись в документации, я обнаружил, что это действительно новый класс, в нем есть улучшения, но он доступен только в Qt5, поэтому вы не можете использовать его, если хотите компилировать как в Qt4, так и в Qt5:

Примечания для пользователей QRegExp

Класс QRegularExpression, представленный в Qt 5, является большим улучшением по сравнению с QRegExp с точки зрения предлагаемых API, поддерживаемого синтаксиса шаблонов и скорости выполнения. Самое большое отличие состоит в том, что QRegularExpression просто содержит регулярное выражение, и оно не изменяется при запросе совпадения. Вместо этого возвращается объект QRegularExpressionMatch, чтобы проверить результат совпадения и извлечь захваченную подстроку. То же самое относится к глобальному сопоставлению и QRegularExpressionMatchIterator.

person sashoalm    schedule 09.04.2015
comment
Да, я потратил некоторое время на то, чтобы написать исчерпывающую документацию для QRegularExpession, вот и все :) - person peppe; 13.04.2015
comment
Я написал весь класс. Если вы считаете, что документацию можно улучшить, отправьте такое предложение в отчет об ошибке. - person peppe; 14.04.2015
comment
- Вы написали ту часть документа? - Я написал весь класс. Это заставило меня лол. - person Gras Double; 26.11.2015
comment
Спасибо @peppe как за написание всего курса, так и за документ! При этом я действительно думаю, что первая строка следующих двух URL-адресов: doc. qt.io/qt-4.8/qregexp.html и doc.qt. io/qt-5/qregularexpression.html должен сказать, пожалуйста, обратите внимание, что в Qt есть ДВЕ системы регулярных выражений [...] - person Lennart Rolland; 18.05.2016
comment
Что ж, в документации QRegExp есть примечание о том, что QRegularExpression является рекомендуемым классом для использования в Qt 5; Документы OTOH QRegularExpression подробно рассматривают проблему переноса с QRegExp. Не стесняйтесь присылать предложения о том, как улучшить формулировку в багтрекере Qt. - person peppe; 18.05.2016
comment
@peppe, поддерживает ли он взгляд сзади? Кажется, я не могу найти никаких ссылок на это в документах. - person Iulian Onofrei; 19.08.2016
comment
@IulianOnofrei: да, он поддерживает просмотр фиксированной длины. Он поддерживает все, что можно найти на странице руководства pcresyntax(3), с исключение выносок, дублированных именованных групп захвата и других подобных небольших ограничений (как указано в документации класса). - person peppe; 25.08.2016

По крайней мере для 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.

person Sascha    schedule 18.10.2017