Russian Qt Forum
Ноябрь 27, 2024, 06:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Регулярные выражение в QT  (Прочитано 2519 раз)
x-sam
Гость
« : Сентябрь 27, 2010, 17:31 »

добрый день. Интересует вопросы выборки с использованием регулярных выражений.
В данный момент проблема состоит в том, что регулярка возвращают только первое совпадение.
Смотрел документацию, но видимо плохо Грустный
Код
C++ (Qt)
       //QString algo = ui->plainTextEdit->toPlainText();
       QString algo = "B y1 x1↑1↑2 ↓1y4y5 ↓2y3 y1 E";
       QRegExp parts("(B|E|(?:x\\d)+|(?:y\\d+)+)");
 
       parts.indexIn(algo);
 
       if (parts.captureCount()) {
           QStringList list = parts.capturedTexts();
           QStringList::iterator it = list.begin();
 
           while (it != list.end()) {
               //ui->statusBar->showMessage(*it);
 
               QMessageBox msgBox;
               msgBox.setText(*it);
               msgBox.exec();
 
               ++it;
            }
       }
 


вернуть должно все лексемы, а не только В

Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #1 : Сентябрь 27, 2010, 19:09 »

Надо повторять indexIn до тех пор пока он не вернет -1, возвращаемое значение с предыдущей итерации передать как offset.
Записан

Гугль в помощь
x-sam
Гость
« Ответ #2 : Сентябрь 28, 2010, 01:42 »

спасибо помогло, для корректной работы реализовал следующим образом

Код
C++ (Qt)
       QString algo = ui->plainTextEdit->toPlainText();
       //QString algo = "B y1 x1^1^2 v1y4y5 v2y3 y1 E";
       QRegExp parts("(B|E|(?:x\\d)+|(?:y\\d+)+)");
       parts.setMinimal(false);
 
 
       int offset = parts.indexIn(algo);
       QStringList::iterator it;
       while (offset!=-1){
 
           if (parts.captureCount()) {
               QStringList list = parts.capturedTexts();
               it = list.begin();
 
               it != list.end();
               QMessageBox msgBox;
               msgBox.setText(*it);
               msgBox.exec();
 
           }
           offset = parts.indexIn(algo, offset+((QString)*it).length());
       }
 
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.189 секунд. Запросов: 22.