Russian Qt Forum

Qt => Общие вопросы => Тема начата: crossly от Январь 27, 2009, 17:07



Название: regexp
Отправлено: crossly от Январь 27, 2009, 17:07
товарищи!!.... нужна светлая голова.... т.е. помощь в составлении регулярного выражения...
есть текст
Цитировать
А1. ываполрдлоыарп: 1) фвыаюлож; 2) фвплорыва; Примечание: ыпдлорап .
нужно запихнуть это в QStringList
должно получится:
1. ываполрдлоыарп
2. фвыаюлож
3. фвплорыва
4. ыпдлорап
помогите плиз...


Название: Re: regexp
Отправлено: ритт от Январь 27, 2009, 17:18
в исходно строке сначала "А1." и терминатор ":", затем уже начало "1)" и терминатор ";", а в последнем случае начало вообще без циферки и включает один из предыдущих терминаторов, а терминатор "."

по какому принципу должен быть разбор и нумерация в списке?


Название: Re: regexp
Отправлено: crossly от Январь 27, 2009, 17:46
вот что у меня получилось с онлайн построителем http://www.regexpres.narod.ru/calculator.html (http://www.regexpres.narod.ru/calculator.html)
Код:
[А,В]\d.|\d\)|Примечание:
там я поставил галку "split".... как теперь это с Qt подружить...??


Название: Re: regexp
Отправлено: lit-uriy от Январь 27, 2009, 21:09
2 crossly, используй QString::split(QRegExp)


Название: Re: regexp
Отправлено: gmorgunov от Январь 28, 2009, 15:54
Можно так ,например, подружить.На выходе то, что вам нужно:
Код:
#include <QtGui>
int main(int argc, char** argv)
{
    QApplication  app(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF8"));

    QString str = QObject::tr("А1. ываполрдлоыарп: 1) фвыаюлож; 2) фвплорыва;Примечание: ыпдлорап .");
    qDebug() << str ;

    QRegExp rx("(\\w+)");

    // разбиваем на слова
    QStringList list;
    int pos = 0;
    while ((pos = rx.indexIn(str, pos)) != -1) {
        list << rx.cap(1);
        pos += rx.matchedLength();
    }
    qDebug() << list;

    // формируем QStringList lresult
    QStringList lresult;
    QString s;
    for (int i = 0; i<4; i++) {
        s.setNum(i+1);
        lresult.append(s + ". " + list[i*2+1]);
        qDebug() << lresult[i];
    }
    return 0;
}


Название: Re: regexp
Отправлено: crossly от Январь 29, 2009, 15:38
короче суть вопроса усложняется... :).... мне нужно разобрать форматированный текст (html)...
что пришло мне в голову... гружу хтмл в QTextDocument (дабы не разбирать тэги)...
далее с помощью
Код:
QTextCursor QTextDocument::find ( const QRegExp & expr, int position = 0, FindFlags options = 0 ) const
выделяю нужные мне куски и сохраняю QStringList...
в общем алгоритм получился такой..
Код:
        QFile f(QDir::homePath()+QDir::separator()+"bel.html");
if(!f.open(QIODevice::ReadOnly))
qDebug()<<"error";
QString str=QString(f.readAll());
QTextDocument *doc=new QTextDocument(str);
QTextCursor tc=doc->find(QRegExp("[А|B]\\d.*\\d\\)"),0);
int i=tc.position();
QStringList list;
list<<tc.selection().toHtml();
while(i>0)
{
QTextCursor tc=doc->find(QRegExp("[А|В]\\d.*\\d\\)"),i);
i=tc.position();
list<<tc.selection().toHtml();
}
но видно я не до понимаю regexp.... в данном случае я получаю
Код:
А1. ываполрдлоыарп: 1) фвыаюлож; 2)
вместо
Код:
А1. ываполрдлоыарп: 1)
помогите плиз разобратся....


Название: Re: regexp
Отправлено: Rcus от Январь 29, 2009, 15:41
Цитировать
QRegExp's quantifiers are the same as Perl's greedy quantifiers (but see the note above). Non-greedy matching cannot be applied to individual quantifiers, but can be applied to all the quantifiers in the pattern. For example, to match the Perl regexp ro+?m requires:

 QRegExp rx("ro+m");
 rx.setMinimal(true);


Название: Re: regexp
Отправлено: crossly от Январь 29, 2009, 15:52
большое спасибо


Название: Re: regexp
Отправлено: crossly от Февраль 04, 2009, 18:30
привет всем .... нужна ещё помощь в поиске в QTextDocument...
содержание документа..
Код:
А1. ываполрдлоыарп: 
 1) фвыаюлож;
 2) фвплорыва;
Примечание: ыпдлорап .
при find(QRegExp("A\\d.*\\d\\)"),0) ничего не находит (хотя по идее должно быть А1. ываполрдлоыарп:
 1) фвыаюлож;
 2))
при  find(QRegExp("A\\d.*)"),0) находит первую строку ... из чего могу сделать вывод что поиск идёт не по всему документу, а только по первой строке...
Помогите плиз добится нужного результата...