crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> QRegExp, хочу разобраться в QRegExp
eldar85
  опции профиля:
сообщение 30.4.2010, 19:23
Сообщение #1


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


есть код:
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
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(eldar85 @ 30.4.2010, 23:23) *
while ((pos = rx.indexIn(xStr, pos)) != -1)
проблема в условии. Что ты сравниваешь с "-1"?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 30.4.2010, 20:20
Сообщение #3


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


блин, не знаю, я этот пример взял из документации))
если честно не могу и в правду понять что я там сравниваю...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 30.4.2010, 20:45
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


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

переменную pos. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 30.4.2010, 21:45
Сообщение #5


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


ага, так а как тогда сделать то??? получается тут идет условие - пока 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:10
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 30.4.2010, 22:40
Сообщение #6


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

как то в bost делал что то подобное, но не помню как...
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 30.4.2010, 22:47
Сообщение #7


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(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
Сообщение #8


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


но так он не поместит найденное в разные 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
Сообщение #9


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(eldar85 @ 1.5.2010, 3:20) *
а мне нужно выпарсить их в разные переменные и уже потом с ними дальше работать...
может тогда тебе будет удобнее помещать фрагменты в список строк (QStringList), потом вытащишь построчно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
eldar85
  опции профиля:
сообщение 1.5.2010, 22:23
Сообщение #10


программист
***

Группа: Участник
Сообщений: 283
Регистрация: 2.1.2010
Из: Москва
Пользователь №: 1348

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 4.4.2020, 17:08