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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Регулярные выражения. Матчится только первая комбинация.  (Прочитано 3038 раз)
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, при вводе всегда единицу.
Есть мысль что индексация происходит не по всему тексту, а только до первого полного совпадения.

Задачу постараюсь решить сам, подскажите, почему матчится только первое выражение?
« Последнее редактирование: Апрель 23, 2012, 15:00 от Gate007 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #1 : Апрель 23, 2012, 15:41 »

почитал бы что делает метод indexIn(), что ли... (возвращает первую позицию совпавшей регулярки, всю строку не парсит).

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
_OLEGator_
Гость
« Ответ #2 : Апрель 23, 2012, 16:12 »

только внутри цикла надо к pos прибавить хотя бы 1, а то бесконечный цикл выйдет
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4744



Просмотр профиля WWW
« Ответ #3 : Апрель 23, 2012, 16:21 »

но лучше как в примере: pos += rx.matchedLength();
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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