Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Общие вопросы _ QRegExp

Автор: eldar85 30.4.2010, 19:23

есть код:

QString f;
    QRegExp rx(str);


             int pos = 0;

             while ((pos = rx.indexIn(xStr, pos)) != -1)
             {
                 f =rx.cap(1);
                 pos += rx.matchedLength();
             }
    
    qDebug() << f;

он парсит отлично, но если мне к примеру нужно найти несколько совпадений например таких:
go to the home at 10 o'clock
go to the home at 11 o'clock
go to the home at 12 o'clock
go to the home at 13 o'clock
go to the home at 14 o'clock

я ставлю в str такую строку: "go to the home at ([0-9]*)"
он находит первую 10, но мне нужно найти все и 10 и 11 и 12 и 13 и 14))) как возможно это сделать?? посоветуйте плиз))

Автор: Litkevich Yuriy 30.4.2010, 19:58

Цитата(eldar85 @ 30.4.2010, 23:23) *
while ((pos = rx.indexIn(xStr, pos)) != -1)
проблема в условии. Что ты сравниваешь с "-1"?

Автор: eldar85 30.4.2010, 20:20

блин, не знаю, я этот пример взял из документации))
если честно не могу и в правду понять что я там сравниваю...

Автор: BRE 30.4.2010, 20:45

Цитата(eldar85 @ 30.4.2010, 21:20) *
если честно не могу и в правду понять что я там сравниваю...

переменную pos. :)

Автор: eldar85 30.4.2010, 21:45

ага, так а как тогда сделать то??? получается тут идет условие - пока pos не равно -1, но это же просто копирование строки в переменную f, по идее все правильно))
мне нужно вот так:

QString f;
QString c;
QString d;
......

    QRegExp rx(str);


             int pos = 0;

             while ((pos = rx.indexIn(xStr, pos)) != -1)
             {
                 f =rx.cap(1); // тут присваивается f 10
                                    //и я хотел остальным Qstring ам присвоить 11, 12, 13, 14 соответственно..
                 с = rx.cap(2); //может так?? но так я пробывал, ничего там не находиться, а находит тольско это f =rx.cap(1) остальное все пустое
                 pos += rx.matchedLength();
             }
    
    qDebug() << f;

пулучается он первое нашел 10 и поместил в QString f это 10. так вот мне нужно например чтобы я мог так
Qstrind f было равно 10
Qstring с было равно 11
Qstring в было рано 12 и так далее))

Автор: eldar85 30.4.2010, 22:40

даже я ошибся, он мне находит последний из нужного, не 10 а 14)) а нужно еще найти 13, 12, 11 и 10)))) вот так ))

как то в bost делал что то подобное, но не помню как...

Автор: Litkevich Yuriy 30.4.2010, 22:47

Цитата(BRE @ 1.5.2010, 0:45) *
переменную pos.
разве?
А по моему он сравнивает результат работы оператора присваивания с минус единицей.

вот мой код:
int pos = 0;
int mch = 0;
int capcnt = 0;
while (pos >= 0)
{
    pos = rx.indexIn(text, pos);

    mch = rx.matchedLength();
    
    if(mch > 0)
    {
        capcnt++;
        outtext->setPlainText(outtext->toPlainText()+rx.cap(0)+"\r\n");
    }

    pos += mch;
    if (!pos) break;
}
Выдрано с мясом, косточки не глотать!

Цитата(Litkevich Yuriy @ 1.5.2010, 2:43) *
А по моему он сравнивает результат работы оператора присваивания с минус единицей.
хм, хотя результат и будет равен переменной pos

Автор: eldar85 30.4.2010, 23:20

но так он не поместит найденное в разные QString ... тут будет все помещенно в один outtext же если я правельно понял... а мне нужно выпарсить их в разные переменные и уже потом с ними дальше работать...

может что то типа этого

QRegExp rx("(\\d+)");
QString str = "Offsets: 12 14 99 231 7";
QStringList list;
int pos = 0;

while ((pos = rx.indexIn(str, pos)) != -1) {
     list << rx.cap(1);
     pos += rx.matchedLength();
}


это тоже из документации... ща попробую и отпешусь...

Автор: Litkevich Yuriy 1.5.2010, 12:02

Цитата(eldar85 @ 1.5.2010, 3:20) *
а мне нужно выпарсить их в разные переменные и уже потом с ними дальше работать...
может тогда тебе будет удобнее помещать фрагменты в список строк (QStringList), потом вытащишь построчно.

Автор: eldar85 1.5.2010, 22:23

я тоже так думаю, так будет проще и думаю более правильно... блин еще не успел попробывать код этот, работы много)) ща буду пробывать, спасибо вам за советы)))

Автор: eldar85 2.5.2010, 9:07

да вот такой вариант работает как нужно

QRegExp rx("(\\d+)");
QString str = "Offsets: 12 14 99 231 7";
QStringList list;
int pos = 0;

while ((pos = rx.indexIn(str, pos)) != -1) {
     list << rx.cap(1);
     pos += rx.matchedLength();
}
qDebug << list;

но есть одно но, почему то он все выпарсивает в двух экзэмплярах, тоесть я делаю qDebug << list; и он выврдит так
"10","10", "11","11", "12","12", "13","13", "14","14" не подскажете из за чего??

даже не два а три экзэмпляра выдает))
"10","10", "10" ..............................

даже так - то два то три экзэмпляра выдает... капец, так вообще не катит... не въеду как убрать то это все...

Автор: eldar85 2.5.2010, 13:32

все, разобрался. это косяк в коде был))) я в rx помещал предыдущую фразу которая дублировалась в тексте, поэтому два раза выводил одно и тоже число))

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)