2015-04-09 2 views

ответ

36

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

Заметки для QRegExp Пользователи

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

+1

Да, я потратил некоторое время на то, чтобы написать полную документацию для QRegularExpession, так что это так :) – peppe

+0

Ты имеешь в виду, что написал эту часть документов? – sashoalm

+16

Я написал весь класс. Если вы считаете, что документы могут быть улучшены, отправьте такое предложение на bugreport. – peppe

0

По крайней мере, для Qt 4.8. Я могу дать очень практическую причину для использования QRegularExpressions вместо QRegExp:

Насколько опасны для вас эти опасения?

int index = myQString.indexOf(myQRegExp); 
bool okay = myQString.contains(myQRegExp); 

Обе линии могут повредить вашу кучу, сбой или повесить ваше приложение. Я испытал повреждение кучи и повесил с Qt 4.8. Сообщение в блоге QString::indexOf() versus 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.