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