Russian Qt Forum

Программирование => С/C++ => Тема начата: Авварон от Октябрь 19, 2017, 20:24



Название: Поиск строк по шаблону
Отправлено: Авварон от Октябрь 19, 2017, 20:24
Ну вот и моя очередь создавать мозголомные темы.

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

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


Название: Re: Поиск строк по шаблону
Отправлено: Old от Октябрь 19, 2017, 20:40
Дааааа. Давненько мы финдреплейсов не писали, вон наш главный финдреплейшик как заскучал. :)

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

И решения с бустом предлагать? :)


Название: Re: Поиск строк по шаблону
Отправлено: Авварон от Октябрь 19, 2017, 22:07
Да, ключи известны. Собственно, первое, что я сделал, это просто порезал строки через ": " и брал ключ-значение (возможно, значение пустое).
Но всю малину попортила строка "key: value (key: value)". В целом, её можно тупо порезать по "(", но верный ли такой подход?


Название: Re: Поиск строк по шаблону
Отправлено: __Heaven__ от Октябрь 20, 2017, 09:00
spirit не?


Название: Re: Поиск строк по шаблону
Отправлено: Old от Октябрь 20, 2017, 09:08
Но всю малину попортила строка "key: value (key: value)". В целом, её можно тупо порезать по "(", но верный ли такой подход?
Если это единственное исключение, то я бы обрабатывал его отдельно и резал бы по '('.
Но если завтра возможно появление новых исключений, например:
"key: value /key: value/"
или
"key: value [key: value] [key: value]"
то по мне лучше сделать некий механизм добавления обработчиков таких исключений.


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

Другой путь - освоение "моцных технологий", если знаете как записать какую-нибудь дустовскую сабру-кадабру, то выйдет покороче