crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QRegExp, как искать все совпадения в строке, (находит первый попавшийся)
Litkevich Yuriy
  опции профиля:
сообщение 15.4.2008, 11:02
Сообщение #1


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

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

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




Репутация:   94  


мучаю пример от тролей
%QTDIR%\examples\tools\regexp
в качестве входной строки пишу так:
delta5 delta6
видит только первую половинку
delta5
а что надо сделать, чтобы при том же, возможно, регулярном выражении находил и остальные соответствия?

---
P.S. в регулярных выражения я есть зеро. Не отфутболивайте к книжкам, пожалуйста :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 16.4.2008, 7:55
Сообщение #2


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


Искать дальше. :-)
Читай ассистента, http://www.crossplatform.ru/?q=node/216QRegExp, http://www.crossplatform.ru/documentation/...4.3/qregexp.php

В ассистенте от 4.3.4 приводится хороший пример:
 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();
}
// list: ["12", "14", "99", "231", "7"]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.4.2008, 8:30
Сообщение #3


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

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

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




Репутация:   94  


первая ссылка не работает, а по поводу асистента, все читать не хотелось, т.к. я скорее из праздного интереса.
мнеб понять как это в Qt'ях делается, где результаты он хранит и т.п.
За пример спасибо.

Я из него так понял, Tonal, поправь если неправильно:
будет найдено первое соответсвие, т.е. его позиция в строке, и длина соответствия (кол-во символов),
затем надо заставить QRegExp, подвинутся на найденое кол-во символов, чтобы он просмотрел дальше, и т.д.

Непонял вот какую штуку:
rx.cap(1)

почему 1, это же вроде соответствие под выражению в шаблоне, а 0 весь шаблон?

Сообщение отредактировал Litkevich Yuriy - 16.4.2008, 8:35
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.4.2008, 9:12
Сообщение #4


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

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

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




Репутация:   94  


у кода:
while ((pos = rx.indexIn(str, pos)) != -1) {
     list << rx.cap(0);
     pos += rx.matchedLength();
}

косячек неприятный, он прогу вешает, когда индекс =0 и длина =0 :(
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.4.2008, 9:57
Сообщение #5


Мастер
******

Группа: Модератор
Сообщений: 3296
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

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




Репутация:   40  


Цитата(Litkevich Yuriy @ 16.4.2008, 9:30) *
первая ссылка не работает
Причудливый QRegExp. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.4.2008, 10:14
Сообщение #6


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

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

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




Репутация:   94  


да интересно, спасибо
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 16.4.2008, 10:21
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

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




Репутация:   17  


Цитата(Litkevich Yuriy @ 16.4.2008, 13:12) *
у кода:
while ((pos = rx.indexIn(str, pos)) != -1) {
     list << rx.cap(0);
     pos += rx.matchedLength();
}

косячек неприятный, он прогу вешает, когда индекс =0 и длина =0 :(

Т.е. твоё выражение может соответствовать 0 символов?
Или правь выражение, или обрабатывай такой случай отдельным местом.

Вполне возможно, поможет просто указание "жадного" режима повторителей QRegExp::RegExp2 (режим как в Perl, Python, PHP, JavaScript...)

P.S. пройди курс на интуите по регэкспам - станет всё ясно. :-)
Лучшая книга: "Регулярные выражения" Дж.Фридл
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 16.4.2008, 10:28
Сообщение #8


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

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

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




Репутация:   94  


я так сделал:
int pos = 0;
int mch = 0;
while (pos >= 0)
{
    pos = rx.indexIn(text, pos);
    outtext->append(rx.cap(0));
    //list << rx.cap(0);
    mch = rx.matchedLength();
    /*
    QMessageBox::information(this, tr("Слот"),
                                tr("Мы в слоте\r\n")+QString("pos=%1, mach=%2").arg(pos).arg(mch),
                                QMessageBox::Ok);
    */
    pos += mch;
    if (!pos) break;
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Dimix
  опции профиля:
сообщение 11.2.2011, 6:29
Сообщение #9


Студент
*

Группа: Участник
Сообщений: 74
Регистрация: 24.11.2010
Пользователь №: 2215

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




Репутация:   0  


Друзья нужна Ваша помощь. Такая проблема есть QComboBox список клиентов ФИО (список весьма не маленький). Нужно сделать живой поиск чтобы введенный поисковый запрос отыскал все совпадения в QComboBox
Пример:
QLineEdit => "ол";
QComboBox => "";
"Пупкин василий Николаевич";
"Ханей Ольга Викторовна"
"Попенко Григорий Батькович"

Нужно чтобы оно ставило на currentIndex() лучшее совпадение
Как это сделать с помощью QRegExp?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 11.2.2011, 10:38
Сообщение #10


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

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




Репутация:   23  


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

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


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




RSS Текстовая версия Сейчас: 30.12.2024, 21:19