Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: QRegExp
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Общие вопросы
eldar85
есть код:
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
Цитата(eldar85 @ 30.4.2010, 23:23) *
while ((pos = rx.indexIn(xStr, pos)) != -1)
проблема в условии. Что ты сравниваешь с "-1"?
eldar85
блин, не знаю, я этот пример взял из документации))
если честно не могу и в правду понять что я там сравниваю...
BRE
Цитата(eldar85 @ 30.4.2010, 21:20) *
если честно не могу и в правду понять что я там сравниваю...

переменную pos. :)
eldar85
ага, так а как тогда сделать то??? получается тут идет условие - пока 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
даже я ошибся, он мне находит последний из нужного, не 10 а 14)) а нужно еще найти 13, 12, 11 и 10)))) вот так ))

как то в bost делал что то подобное, но не помню как...
Litkevich Yuriy
Цитата(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
но так он не поместит найденное в разные 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
Цитата(eldar85 @ 1.5.2010, 3:20) *
а мне нужно выпарсить их в разные переменные и уже потом с ними дальше работать...
может тогда тебе будет удобнее помещать фрагменты в список строк (QStringList), потом вытащишь построчно.
eldar85
я тоже так думаю, так будет проще и думаю более правильно... блин еще не успел попробывать код этот, работы много)) ща буду пробывать, спасибо вам за советы)))
eldar85
да вот такой вариант работает как нужно
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
все, разобрался. это косяк в коде был))) я в rx помещал предыдущую фразу которая дублировалась в тексте, поэтому два раза выводил одно и тоже число))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2020 IPS, Inc.