Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование регулярных выражений в Qt

25K
07 ноября 2007 года
Andreu_Re
16 / / 11.06.2007
Проблема с решением задачи выделения строки из HTML-текста обрамленной набором символов, например комментариев.
На первый взгляд показалось, что это просто, но, во первых я не нашел для класса 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]*?-->) - ничего не находит
502
10 ноября 2007 года
Jail
550 / / 30.01.2007
А если это просто сделать стандартными средствами, как отдельная подпрограмма-задача, а потом вставить поверх QT?
25K
11 ноября 2007 года
Andreu_Re
16 / / 11.06.2007
Так и пришлось пока сделать, только это не "спортивно", хочется разобраться с регулярными выражениями.
На первый взгляд простая задача - слева точное сочетание символов и справа то же.

Варианты, где ничего не находит я понял, дополнительный символ '?' означает закончить поиск подвыражения при минимальном совпадении, а так как за этим нигде в html нет "-->" (если не написать специально) то и общего совпадения не происходит.
502
11 ноября 2007 года
Jail
550 / / 30.01.2007
Просмотрел иерархию классов QT, но ничего даже близкого не нашел :( Конешно, QT не только библиотека виджетов; так же включает динамические библиотеки и систему расширений....
Может все же стоит немного пересмотреть Вашу задачу и использовать наиболее преспособленные к этому вещи! Например Perl имеет специальные процедуры для такого поиска да и вобще прекрасно обращается именно с текстом. Лично посоветовал бы возможности Python по этому поводу, так как он имеет возможности интеграции с библиотекой QT ;)
25K
11 ноября 2007 года
Andreu_Re
16 / / 11.06.2007
Так регексп в Qt как раз и позиционируется (в доках), как использующий регулярные выражения Perl. И разбираюсь по книжке Дж. Фридла "Регулярные выражения" на примерах из Perl-a.

А где найти исходники и описание для интеграции с Python, можно быстро освоить применение этого Python?

Может у меня не правильно составлены сами выражения?
502
12 ноября 2007 года
Jail
550 / / 30.01.2007
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 приладами, так же существует большое число модулей, описать которые я здесь не в силах...
25K
12 ноября 2007 года
Andreu_Re
16 / / 11.06.2007
Спасибо за ответы.
С английским, для свободного чтения документации, напряг.
Что нибудь уточнить или вспомнить или воспользоваться как справочником - это без проблем.

Да и вообще освоение - освоением, это конечно хорошо, но надо - ли, если Qt поддерживает регулярные выражения, как они пишут Perl (конечно с какими то отличиями)?

Работаю с текстами, HTML используется не более чем формат для разметки документа не связанного с веб-ом.
502
17 ноября 2007 года
Jail
550 / / 30.01.2007
Если проблема с английским...то это большая преграда.
Может конешно QT и прекрасно поддерживает регулярные выражения (как в литературе написано), но просто у самого языка Python множество возможностей, которые не может включать в себя QT (все же в большей степени это библиотека виджетов), а плюс интеграция с PyQT - это же перспективы модульности и компактности кода ( в сравнение, одна и таже программа реализованная на С++ и на Python занимает на последнем меньшее число строк кода :). К тому же python ничуть не хуже работает с текстом! Плюс, программы на Perl при КАЖДОМ выполнении компиляться в исполняемый файл, а на Python только при первой компиляции, причом оба языка считаются скриптовыми, но.....Perl многое только снилось :)
Вообщем выбор как всегда остаётся за Вами.
25K
17 ноября 2007 года
Andreu_Re
16 / / 11.06.2007
Да, надо, как минимум, посмотреть что это все собой представляет, когда закончу разбирать STL.

А все же, реально ли решить мою задачку посредством регулярных выражений, пусть не обязательно от Qt?
502
17 ноября 2007 года
Jail
550 / / 30.01.2007
[LEFT]Возможно всё, но и возможно не всё :)
Кое что нарыл по регулярным выражениям:
Стандартные средства --> 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]
25K
18 ноября 2007 года
Andreu_Re
16 / / 11.06.2007
Спасибо, как нибудь поизучаю.

http://www.piter.com/lib/97853180005...phtml?fil=ch02 - это и есть книга Фридла, которую изучаю сейчас.
14K
11 февраля 2008 года
andrey_hello2007
50 / / 30.05.2007
Понял (а точнее дочитал у Фридла до "Механизм поиска совпадений"), что означает "жадность" квантификаторов + и *.

Происходит полное "поглощение" строки, подпадающей под совпадение с квантификатором + или * и лишь затем, если следующее подвыражение регулярного выражения не совпадает, то "поглощенная" строка постепенно "отдает" символ за символом назад пока следующее подвыражение не совпадет.

Т. о. мое выражение находило сочетание <!-- и последнее в документе сочетание -->.

Если как то запретить в совпавшей подстроке с квантификатором + или * сочетание -->, то проблема решилась бы.
361
12 февраля 2008 года
Odissey_
661 / / 19.09.2006
Код:
#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;
}

Получаем вывод:
Цитата:

<!-- comment1 --> - и это коментарий!!!
<!-- comment2 --> - и это коментарий!!!

14K
13 февраля 2008 года
andrey_hello2007
50 / / 30.05.2007
Как говорится "из песни слова не выкинешь".

Работает только так, как написано: [\\S\\s]*(<!--[\\S\\s]*(?=-->)-->)

rx.setMinimal(true); - почитал справку Qt - это понятно, работает оказывается не так, как минимальность знаком вопроса после квантификатора, а вот не могу понять почему без первого [\\S\\s]* не происходит совпадения и почему обязательно и опережающую проверку вставлять и следом подстроку --> ?
361
13 февраля 2008 года
Odissey_
661 / / 19.09.2006
Цитата: andrey_hello2007
а вот не могу понять почему без первого [\\S\\s]* не происходит совпадения и почему обязательно и опережающую проверку вставлять и следом подстроку --> ?


Совпадение и без первого [\\S\\s]* будут происходить. Это просто я по привычке вставил - с Qt регэкспами сталкиватся почти не приходилось. Просто показывает что между коментариями возможен 0 или более текста.

Цитата: andrey_hello2007
и почему обязательно и опережающую проверку вставлять и следом подстроку --> ?


Тоже можно убрать следующий за проверкой -->. Вывод тогда будет следующим

Цитата:
<!-- comment1 - и это коментарий!!!
<!-- comment2 - и это коментарий!!!


Просто задумывался рабочий пример с rx.setMinimal(true);
Поиграйтесь с регулярными выражениями. Немного практики и они перестают казатся сложными. Кстати, упомянутая вами книга пожалуй лучшая что я знаю про регэкспы.

14K
13 февраля 2008 года
andrey_hello2007
50 / / 30.05.2007
Да, действительно происходят совпадения, просто я пытался "выключать" часть регекспа комментированием, а среда не воспринимала это как комментарий кода:

QRegExp rx("/*[\\S\\s]**/(<!--[\\S\\s]*(?=-->)-->)");

Когда просто выкинул куски из строки заработало.

Значит вся собака порылась в rx.setMinimal(true); - Qt-шная особенность.

Интересно, а без этой функции можно составить подобное?
14K
14 февраля 2008 года
andrey_hello2007
50 / / 30.05.2007
Всем спасибо, наконец понял, что нет, блин, в Qt *? +? ?? {}?.

Минимальные квантификаторы поддерживаются только setMinimal(true), и это ограничивает возможности выражения, т. к. функция выключает "жадность" у всех "жадных" квантификаторов выражения.


Для рассматривавшегося примера с комментариями достаточно даже простого:
 
Код:
QRegExp rx("(<!--[\\S\\s]*-->)");
    rx.setMinimal(true);
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог