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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QRegExp и QLineEdit  (Прочитано 5586 раз)
psk07
Гость
« : Сентябрь 23, 2019, 12:57 »

Всем привет. Помогите люди добрые с QRexExp.
Стоит нестандартная задача, надо сделать поисковое окно, в котором 50 QLineEdit. 10 строк по 5 полей ввода. В каждой строке поля ввода между собой соединены, как значение &, а сами строки между собой соединены, как значения |.

Помогите пожалуй сделать рабочий QRegExp. В моем случае regExp.indexIn() проверяет QString на соответствие поисковому запросу.

На сайте regex101 данный вариант работает:
^.*(((?=.*Line1)(?=.*Line2)(?=.*Line3)(?=.*Line4)(?=.*Line5))|((?=.*Line6)(?=.*Line7)(?=.*Line8)(?=.*Line9)(?=.*Line10))|((?=.*Line11)(?=.*Line12)(?=.*Line13)(?=.*Line14)(?=.*Line15))|((?=.*Line16)(?=.*Line17)(?=.*Line18)(?=.*Line19)(?=.*Line20))|((?=.*Line21)(?=.Line22*)(?=.*Line23)(?=.*Line24)(?=.*Line25))|((?=.*Line26)(?=.*Line27)(?=.*Line28)(?=.*Line29)(?=.*Line30))|((?=.*Line31)(?=.*Line32)(?=.Line33)(?=.Line34)(?=.*Line35))|((?=.*Line36)(?=.*Line37)(?=.*Line38)(?=.*Line39)(?=.*Line40))|((?=.*Line41)(?=.*Line42)(?=.*Line43)(?=.*Line44)(?=.*Line45))|((?=.*Line46)(?=.*Line47)(?=.48)(?=.*49)(?=.*50))).*$

Если я правильно понимаю, то в QRegExp беды с точкой, то тогда чем заменить ленивый поиск .* ?

Заранее всем спасибо.
« Последнее редактирование: Сентябрь 26, 2019, 07:55 от psk07 » Записан
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Сентябрь 23, 2019, 15:47 »

В эпоху интерфейсов с одной кнопкой, 50 QLineEdit-ов смотрятся очень приятно )

QRegExp::setMinimal ?
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #2 : Сентябрь 23, 2019, 20:15 »

смущает ?= — может там должно быть ?: ? да и QRexExp, в отличие от QRegularExpression, не поддерживает ?= (lookahead).

а почему нельзя просто тупо склеить содержимое полей ввода одной строки? Line1Line2Line3Line4Line5. Тогда искомое выражение будет (?:Line1Line2Line3Line4Line5)|(?:Line6Line7Line8Line9Line10)|... Или каждое поле ввода матчит лишь часть строки? В таком случае поставить .* между ними (по краям внутри скобки не надо).
« Последнее редактирование: Сентябрь 23, 2019, 20:18 от kambala » Записан

Изучением 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
psk07
Гость
« Ответ #3 : Сентябрь 24, 2019, 09:15 »

смущает ?= — может там должно быть ?: ? да и QRexExp, в отличие от QRegularExpression, не поддерживает ?= (lookahead).

а почему нельзя просто тупо склеить содержимое полей ввода одной строки? Line1Line2Line3Line4Line5. Тогда искомое выражение будет (?:Line1Line2Line3Line4Line5)|(?:Line6Line7Line8Line9Line10)|... Или каждое поле ввода матчит лишь часть строки? В таком случае поставить .* между ними (по краям внутри скобки не надо).

Если все 5 значений находятся в строке, до данная строка идёт на отображение в QListView.
а) В данном варианте склейки есть чувствительность поиска к порядку ввода данных Line1Line2Line3Line4Line5, как можно решить данную проблему?
б) Такую же проблему заметил с поиском по значениям или. Поля поиска должны соответствовать своему положению в строке, L6-L10 не может быть раньше L1-L5.
в) Каждое поле ввода матчит часть строки.  Правильно я вас понял насчёт вставки .* ?  
(?:.*Line1.*Line2.*Line3.*Line4.*Line5)|(?:.*Line6.*Line7.*Line8.*Line9.*Line10)|...

Заранее спасибо.
« Последнее редактирование: Сентябрь 24, 2019, 10:28 от psk07 » Записан
psk07
Гость
« Ответ #4 : Сентябрь 24, 2019, 09:16 »

В эпоху интерфейсов с одной кнопкой, 50 QLineEdit-ов смотрятся очень приятно )

QRegExp::setMinimal ?
Опробую сегодня, спасибо за направление, там же нашёл и пилюли для борьбы с регистром.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Сентябрь 24, 2019, 11:31 »

а) путем создания 5!=120 перестановок для каждой строки: 12345, 12354, ...
б) если склеивание через | работает не так, как хотелось бы, то можно просто перебирать строки в цикле по очереди: выход из цикла при совпадении
в) .* перед ?: не надо (это сразу так и работает)

хитрый, конечно, функционал... Улыбающийся
Записан

Изучением 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
psk07
Гость
« Ответ #6 : Сентябрь 24, 2019, 15:18 »

а) путем создания 5!=120 перестановок для каждой строки: 12345, 12354, ...
б) если склеивание через | работает не так, как хотелось бы, то можно просто перебирать строки в цикле по очереди: выход из цикла при совпадении
в) .* перед ?: не надо (это сразу так и работает)

хитрый, конечно, функционал... Улыбающийся
Не совсем понял насчёт пункта а, буду благодарен за набросок.)
По поводу пункта в, по мистическим причинам работает только с .* перед ?:
Второй день уже прыгаю с бубном вокруг этого функционала)
« Последнее редактирование: Сентябрь 24, 2019, 15:29 от psk07 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #7 : Сентябрь 24, 2019, 16:38 »

а) если интересует абсолютно произвольный порядок пяти строк, то нужно рассмотреть все возможные перестановки пяти элементов, их количество равно 5!=120. Пример для трех, 3!=6: 123, 132, 312, 321, 231, 213. Все эти варианты склеить через |, ну либо циклом аналогично пункту б)
Записан

Изучением 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
psk07
Гость
« Ответ #8 : Сентябрь 25, 2019, 07:55 »

а) если интересует абсолютно произвольный порядок пяти строк, то нужно рассмотреть все возможные перестановки пяти элементов, их количество равно 5!=120. Пример для трех, 3!=6: 123, 132, 312, 321, 231, 213. Все эти варианты склеить через |, ну либо циклом аналогично пункту б)
а)Методом проб и ошибок достиг нужного  результата с Line№Line№Line№Line№Line№, вот таким результатом. (?=.*Line№)(?=.*Line№)(?=.*Line№)(?=.*Line№)(?=.*Line№), но перестали работать значения или.
(?=.*Line№)(?=.*Line№)(?=.*Line№)(?=.*Line№)(?=.*Line№)|(?=.*Line№)(?=.*Line№)(?=.*Line№)(?=.*Line№)(?=.*Line№)...

Подскажите пожалуйста, как можно решить данную проблему?

б) Дальше у меня задача, через QCombobox дать пользователю возможность выбора подсветки фона для каждого .*Line№.*Line№.*Line№.*Line№.*Line№.  Буду рад любым интересным соображениям по реализации.)
« Последнее редактирование: Сентябрь 25, 2019, 10:40 от psk07 » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #9 : Сентябрь 25, 2019, 11:52 »

а) вместо или можно цикл
б) не очень понятно чего хочется добиться Улыбающийся вставить по комбобоксу в строку, в котором выбирать цвет строки?
Записан

Изучением 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
psk07
Гость
« Ответ #10 : Сентябрь 25, 2019, 12:32 »

а) вместо или можно цикл
б) не очень понятно чего хочется добиться Улыбающийся вставить по комбобоксу в строку, в котором выбирать цвет строки?
а) на той же мысли остановился)
б) каждой строке поиска пользователь может задавать цвет фона найденным совпадениям.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #11 : Сентябрь 25, 2019, 13:55 »

Цитировать
вставить по комбобоксу в строку, в котором выбирать цвет строки
это не подходит? либо я все равно не понял требования...
Записан

Изучением 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
psk07
Гость
« Ответ #12 : Сентябрь 25, 2019, 14:26 »

Цитировать
вставить по комбобоксу в строку, в котором выбирать цвет строки
это не подходит? либо я все равно не понял требования...
Спасибо за помощь с регуляркой. С комбобоксом, пока сам повожусь, т.к ещё до конца не продумал реализацию, потому не не получается корректно выразить мысль.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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