Russian Qt Forum

Qt => Общие вопросы => Тема начата: x-sam от Сентябрь 27, 2010, 17:31



Название: Регулярные выражение в QT
Отправлено: 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;
            }
       }
 


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



Название: Re: Регулярные выражение в QT
Отправлено: navrocky от Сентябрь 27, 2010, 19:09
Надо повторять indexIn до тех пор пока он не вернет -1, возвращаемое значение с предыдущей итерации передать как offset.


Название: Re: Регулярные выражение в QT
Отправлено: x-sam от Сентябрь 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());
       }