Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

По крайней мере, для 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() inlines QString::indexOf(), так что та же проблема.

Если вы застряли с Qt4 и таким образом QRegExp, вы можете использовать

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

в ваших источниках. Или исправить источники Qt.