#include <iostream.h>
#include <qapplication.h>
#include <qregexp.h>
int main( int argc, char ** argv )
{
QRegExp rx("[\\S\\s]*(<!--[\\S\\s]*(?=-->)-->)");
rx.setMinimal(true);
QString str = "test <!-- comment1 --> test <!-- comment2 --> test";
QStringList list;
int pos = 0;
while ((pos = rx.search(str, pos)) != -1)
{
list << rx.cap(1);
pos += rx.matchedLength();
}
for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it )
std::cout << *it << " - и это коментарий!!!" << std::endl;
return 0;
}
Использование регулярных выражений в Qt
На первый взгляд показалось, что это просто, но, во первых я не нашел для класса QRegExp Qt3 возможности ретроспективной проверки.
Так, как я пробовал либо не находит ничего, либо выделяет весь документ до конца, начиная от первого совпадения с "<!--".
QRegExp regExpKomm(tr(""), false, false);
// (<!--[\\S\\s]*(?=-->)-->) - выдает все
// (<!--[\\S\\s]*?(?=-->)-->) - ничего не находит
// (<!--[\\S\\s]*-->) - выдает все
// (<!--[\\S\\s]*?-->) - ничего не находит
// (<!--[\\S\\s]*(?=-->)) - выдает все
// (<!--[\\S\\s]*?(?=-->)) - ничего не находит
// (<!--[\\S\\s]*(?=[-][-][>])) - выдает все
// (<!--[\\W\\w]*(?=-->)) - выдает все
// (<!--[\\W\\w]+(?=-->)) - выдает все
// (<!--[\\W\\w]*-->) - выдает все
// (<!--[\\W\\w]*?-->) - ничего не находит
А если это просто сделать стандартными средствами, как отдельная подпрограмма-задача, а потом вставить поверх QT?
На первый взгляд простая задача - слева точное сочетание символов и справа то же.
Варианты, где ничего не находит я понял, дополнительный символ '?' означает закончить поиск подвыражения при минимальном совпадении, а так как за этим нигде в html нет "-->" (если не написать специально) то и общего совпадения не происходит.
Может все же стоит немного пересмотреть Вашу задачу и использовать наиболее преспособленные к этому вещи! Например Perl имеет специальные процедуры для такого поиска да и вобще прекрасно обращается именно с текстом. Лично посоветовал бы возможности Python по этому поводу, так как он имеет возможности интеграции с библиотекой QT ;)
А где найти исходники и описание для интеграции с Python, можно быстро освоить применение этого Python?
Может у меня не правильно составлены сами выражения?
Книжки и доки по питону можно глянуть тут --> http://proklondike.com/index.php?part=5&mainpart=1
Для использования Python вместе с библиотекой QT существует, что ли версия под Python QT, называется PyQT. Последняя версия PyQT 4.1. Вот что я нашел в google на эту тему --> http://www.google.ru/search?q=PyQT&ie=utf-8&oe=utf-8&rls=org.mozilla:ru:official&client=firefox-a
Единственный минус - для незнающих английский найти документацию на PyQT на русском практически невозможно :( Но есть отличные англоязычные описания с подробностями интеграции и разработки приложений с PyQT. Python кстате неплохо работает с Web приладами, так же существует большое число модулей, описать которые я здесь не в силах...
С английским, для свободного чтения документации, напряг.
Что нибудь уточнить или вспомнить или воспользоваться как справочником - это без проблем.
Да и вообще освоение - освоением, это конечно хорошо, но надо - ли, если Qt поддерживает регулярные выражения, как они пишут Perl (конечно с какими то отличиями)?
Работаю с текстами, HTML используется не более чем формат для разметки документа не связанного с веб-ом.
Может конешно QT и прекрасно поддерживает регулярные выражения (как в литературе написано), но просто у самого языка Python множество возможностей, которые не может включать в себя QT (все же в большей степени это библиотека виджетов), а плюс интеграция с PyQT - это же перспективы модульности и компактности кода ( в сравнение, одна и таже программа реализованная на С++ и на Python занимает на последнем меньшее число строк кода :). К тому же python ничуть не хуже работает с текстом! Плюс, программы на Perl при КАЖДОМ выполнении компиляться в исполняемый файл, а на Python только при первой компиляции, причом оба языка считаются скриптовыми, но.....Perl многое только снилось :)
Вообщем выбор как всегда остаётся за Вами.
А все же, реально ли решить мою задачку посредством регулярных выражений, пусть не обязательно от Qt?
Кое что нарыл по регулярным выражениям:
Стандартные средства --> http://www.ibm.com/developerworks/ru/library/au-regexp/index.html
Примеры на Perl -> http://www.piter.com/lib/978531800056/regvir.phtml?fil=ch02
Кое что по текстовой обработке в Python (все же лучше книжку прочитать) --> http://www.ibm.com/developerworks/ru/library/l-python5/index.html
Дальше додумывайтесь сами, информации думаю достаточно ;)
Так и быть.... примеры программ на Python, вдруг все же пригодиться --> http://py.vaults.ca/apyllo.py
[/LEFT]
http://www.piter.com/lib/97853180005...phtml?fil=ch02 - это и есть книга Фридла, которую изучаю сейчас.
Происходит полное "поглощение" строки, подпадающей под совпадение с квантификатором + или * и лишь затем, если следующее подвыражение регулярного выражения не совпадает, то "поглощенная" строка постепенно "отдает" символ за символом назад пока следующее подвыражение не совпадет.
Т. о. мое выражение находило сочетание <!-- и последнее в документе сочетание -->.
Если как то запретить в совпавшей подстроке с квантификатором + или * сочетание -->, то проблема решилась бы.
Код:
Получаем вывод:
Цитата:
<!-- comment1 --> - и это коментарий!!!
<!-- comment2 --> - и это коментарий!!!
Работает только так, как написано: [\\S\\s]*(<!--[\\S\\s]*(?=-->)-->)
rx.setMinimal(true); - почитал справку Qt - это понятно, работает оказывается не так, как минимальность знаком вопроса после квантификатора, а вот не могу понять почему без первого [\\S\\s]* не происходит совпадения и почему обязательно и опережающую проверку вставлять и следом подстроку --> ?
Цитата: andrey_hello2007
а вот не могу понять почему без первого [\\S\\s]* не происходит совпадения и почему обязательно и опережающую проверку вставлять и следом подстроку --> ?
Совпадение и без первого [\\S\\s]* будут происходить. Это просто я по привычке вставил - с Qt регэкспами сталкиватся почти не приходилось. Просто показывает что между коментариями возможен 0 или более текста.
Цитата: andrey_hello2007
и почему обязательно и опережающую проверку вставлять и следом подстроку --> ?
Тоже можно убрать следующий за проверкой -->. Вывод тогда будет следующим
Цитата:
<!-- comment1 - и это коментарий!!!
<!-- comment2 - и это коментарий!!!
<!-- comment2 - и это коментарий!!!
Просто задумывался рабочий пример с rx.setMinimal(true);
Поиграйтесь с регулярными выражениями. Немного практики и они перестают казатся сложными. Кстати, упомянутая вами книга пожалуй лучшая что я знаю про регэкспы.
QRegExp rx("/*[\\S\\s]**/(<!--[\\S\\s]*(?=-->)-->)");
Когда просто выкинул куски из строки заработало.
Значит вся собака порылась в rx.setMinimal(true); - Qt-шная особенность.
Интересно, а без этой функции можно составить подобное?
Минимальные квантификаторы поддерживаются только setMinimal(true), и это ограничивает возможности выражения, т. к. функция выключает "жадность" у всех "жадных" квантификаторов выражения.
Для рассматривавшегося примера с комментариями достаточно даже простого:
Код:
QRegExp rx("(<!--[\\S\\s]*-->)");
rx.setMinimal(true);
rx.setMinimal(true);