Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Gate007 от Апрель 23, 2012, 14:51



Название: Регулярные выражения. Матчится только первая комбинация.
Отправлено: Gate007 от Апрель 23, 2012, 14:51
Задача: реализовать подсчет числа слов в поле. Есть еще несколько нюансов, но в данном случае они неважны.
Для теста и написания регулярного выражения был использован RegexBuddy, flavor-PERL.
Регулярка выглядит следующим образом:
Код:
\b\w*(\/*\w*\-*\w*)*\w*\b
В Qt написал слот, который связан с сигналом textchanged.
Код:
void MainWindow::WordCounterSlot()
{
    QRegExp count_rule ("\\b\\w*(\\/*\\w*\\-*\\w*)*\\w*\\b");
    count_rule.setPatternSyntax(QRegExp::RegExp2);
    count_rule.indexIn(ui->textEdit->toPlainText());
    QStringList list = count_rule.capturedTexts(); // для отладки
    ui->lcdNumber->display(count_rule.captureCount());
}
До ввода текста показывает 0, при вводе всегда единицу.
Есть мысль что индексация происходит не по всему тексту, а только до первого полного совпадения.

Задачу постараюсь решить сам, подскажите, почему матчится только первое выражение?


Название: Re: Регулярные выражения. Матчится только первая комбинация.
Отправлено: kambala от Апрель 23, 2012, 15:41
почитал бы что делает метод indexIn(), что ли... (возвращает первую позицию совпавшей регулярки, всю строку не парсит).

для просмотра всей строки используй
Код
C++ (Qt)
int pos = 0;
while ((pos = count_rule.indexIn(ui->textEdit->toPlainText(), pos)) != -1)
{
   // обработка
}
(это кстати написано в том же описании indexIn())


Название: Re: Регулярные выражения. Матчится только первая комбинация.
Отправлено: _OLEGator_ от Апрель 23, 2012, 16:12
только внутри цикла надо к pos прибавить хотя бы 1, а то бесконечный цикл выйдет


Название: Re: Регулярные выражения. Матчится только первая комбинация.
Отправлено: kambala от Апрель 23, 2012, 16:21
но лучше как в примере: pos += rx.matchedLength();