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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Поиск строк по шаблону  (Прочитано 4096 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« : Октябрь 19, 2017, 20:24 »

Ну вот и моя очередь создавать мозголомные темы.

Есть текст (html или plain), в котором находятся строчки вида
"блабла: число (блаблабла число)
фубар: число
фубаз: время
базфу"

Порядок строчек известен, но некоторые могут отсутствовать. Каждой строчке, допустим, сопоставлен ключ (или два ключа)
Что нужно - выцепить значения чисел и времени по ключам, т.е. для каждой строки понять что это за строка и вытащить из неё значения, в ней находящиеся.
Тупое решение - сделать кучу регекспов и матчить строки. Сложность у него N*N, где N - возможное кол-во строк. Можно ли лучше/проще?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Октябрь 19, 2017, 20:40 »

Дааааа. Давненько мы финдреплейсов не писали, вон наш главный финдреплейшик как заскучал. Улыбающийся

Не очень понятна задача.
Нужно находить строки, которые начинаются на
key: value
и сохранять эти пары в какой-то ассоциативный контейнер?
Или ключи известны?

И решения с бустом предлагать? Улыбающийся
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Октябрь 19, 2017, 22:07 »

Да, ключи известны. Собственно, первое, что я сделал, это просто порезал строки через ": " и брал ключ-значение (возможно, значение пустое).
Но всю малину попортила строка "key: value (key: value)". В целом, её можно тупо порезать по "(", но верный ли такой подход?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Октябрь 20, 2017, 09:00 »

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

Сообщений: 4350



Просмотр профиля
« Ответ #4 : Октябрь 20, 2017, 09:08 »

Но всю малину попортила строка "key: value (key: value)". В целом, её можно тупо порезать по "(", но верный ли такой подход?
Если это единственное исключение, то я бы обрабатывал его отдельно и резал бы по '('.
Но если завтра возможно появление новых исключений, например:
"key: value /key: value/"
или
"key: value [key: value] [key: value]"
то по мне лучше сделать некий механизм добавления обработчиков таких исключений.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Октябрь 20, 2017, 13:12 »

Но всю малину попортила строка "key: value (key: value)". В целом, её можно тупо порезать по "(", но верный ли такой подход?
Ну если по-быстрому, то почему бы и нет. Если более капитально, то все сводится к тому же: нужно бить строку на токены (QStringRef, в общем случае итератор), напр для строки выше список токенов
Код:
key
:
value
(key: value)
И разбор становится очевидным: первый токен ключ, второй двоеточие, третий значение. Если потом нужно будет заняться тем что в скобках - опять его в список токенов и.т.д. Обратите внимание что в случае ошибки легко будет показать (подсветить) где она.

Другой путь - освоение "моцных технологий", если знаете как записать какую-нибудь дустовскую сабру-кадабру, то выйдет покороче
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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