Russian Qt Forum
Ноябрь 23, 2024, 06:57
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Парсинг строки определенного типа
Страниц: [
1
]
2
3
...
8
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Парсинг строки определенного типа (Прочитано 48577 раз)
Torvald
Самовар
Offline
Сообщений: 119
Парсинг строки определенного типа
«
:
Май 01, 2014, 11:46 »
Здравствуйте, есть строки вида:
1. "-Y 1 +X 1"
2. "-Y 1024 +X 1024"
3. "#Year 1536 count 1024"
4. "+Y 128 +X 128"
Необходимо считать числа M и N в строках вида "-Y M +X N", то есть в моем примере строки 1 и 2 валидные, а строки 3 и 4 нужно отбросить. Так же строки могут быть пустыми и без пробелов.
Вопрос: как это сделать средствами Qt не прибегая к sscanf и желательно без регулярных выражений?
Регэкспы кажутся медленными (хотя могу ошибаться, скорость не замерял), так что пока мое решение такое:
1. Сплит строки по пробелам
2. Если элементов 4, то:
2.1. Если 0 и 2 подстроки "-Y" и "+X" соответственно, то подстроки 1 и 3 конвертируем к интам
Записан
m_ax
Джедай : наставник для всех
Offline
Сообщений: 2095
Re: Парсинг строки определенного типа
«
Ответ #1 :
Май 01, 2014, 12:57 »
Цитировать
Регэкспы кажутся медленными (хотя могу ошибаться, скорость не замерял), так что пока мое решение такое:
1. Сплит строки по пробелам
2. Если элементов 4, то:
2.1. Если 0 и 2 подстроки "-Y" и "+X" соответственно, то подстроки 1 и 3 конвертируем к интам
Так предложенный вами вариант, будет ещё медленней
Не говоря уже о том, что и менее гибкий..
Записан
Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..
Arch Linux Plasma 5
Bepec
Гость
Re: Парсинг строки определенного типа
«
Ответ #2 :
Май 01, 2014, 17:02 »
Пролетать по строке, проверяя каждый символ. Если сочетание, то следующие символы до пробела конвертируем в число и вносим соответственно сочетанию.
Т.е. QString и indexOf или же char * и char[]
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Парсинг строки определенного типа
«
Ответ #3 :
Май 02, 2014, 05:53 »
Отрадно видеть заботу о скорости
Да, split создает контейнер, выделяет память на каждый эл-т - все это недешево, и за удобство придется платить производительностью. Но о каких данных идет речь? Если тех строк до 2 Mb (на глазок), то на расходы можно спокойно забить. Если "выжимать" то придется немного потрудиться и сделать базовую ф-цию напр
Код
C++ (Qt)
QStringRef NextWord
(
QStringRef
&
str
)
;
// возвращает следующее "слово" в строке
А дальше уже несложно накрутить. Кстати разделитель может быть не только пробел но и таб.
Записан
Bepec
Гость
Re: Парсинг строки определенного типа
«
Ответ #4 :
Май 02, 2014, 11:10 »
Без сомнения всё может быть, но в приведённом примере разделитель пробел
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Парсинг строки определенного типа
«
Ответ #5 :
Май 02, 2014, 13:11 »
для подобных задач регулярки и были придуманы
Записан
Изучением 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
Bepec
Гость
Re: Парсинг строки определенного типа
«
Ответ #6 :
Май 02, 2014, 13:20 »
Они избыточны на таком формате по моему мнению
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Парсинг строки определенного типа
«
Ответ #7 :
Май 02, 2014, 13:55 »
Цитата: Bepec от Май 02, 2014, 11:10
Без сомнения всё может быть, но в приведённом примере разделитель пробел
Откуда такая уверенность? Размер табуляции = 1 не запрещен. И Ваша логика недоступна моему пониманию: работать должен только "этот" пример или как?
Цитата: kambala от Май 02, 2014, 13:11
для подобных задач регулярки и были придуманы
Ну как пойдет частокол слешей - то все, ховайся
Записан
kambala
Джедай : наставник для всех
Offline
Сообщений: 4747
Re: Парсинг строки определенного типа
«
Ответ #8 :
Май 02, 2014, 14:05 »
Цитата: Bepec от Май 02, 2014, 13:20
Они избыточны на таком формате по моему мнению
на мой взгляд в данном случае избыточным будет это:
Цитата: Bepec от Май 01, 2014, 17:02
Пролетать по строке, проверяя каждый символ. Если сочетание, то следующие символы до пробела конвертируем в число и вносим соответственно сочетанию.
Цитата: Torvald от Май 01, 2014, 11:46
1. Сплит строки по пробелам
2. Если элементов 4, то:
2.1. Если 0 и 2 подстроки "-Y" и "+X" соответственно, то подстроки 1 и 3 конвертируем к интам
регулярка решает задачу одной строкой («правилом», как в другой теме
)
Цитата: Igors от Май 02, 2014, 13:55
Цитата: kambala от Май 02, 2014, 13:11
для подобных задач регулярки и были придуманы
Ну как пойдет частокол слешей - то все, ховайся
в С++11 это уже не проблема с литеральными строками
Записан
Изучением 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
Bepec
Гость
Re: Парсинг строки определенного типа
«
Ответ #9 :
Май 02, 2014, 14:37 »
Регулярное выражение с правилами займёт больше времени выполнения, чем "просто пролетать по строке". Проверял неоднократно.
И да, ваше регулярное выражение так же "пролетает по строке", выдёргивая всё что надо
to Igors: я решаю задачи. Везде. Есть задача - имеется данный формат, описания нет, есть строка. Как распарсить. Ответ дан. Дополнительные условия не приведены, следовательно посылать всех лесом, кто воскликнет - А ЕСЛИ?
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Парсинг строки определенного типа
«
Ответ #10 :
Май 02, 2014, 14:44 »
Цитата: Bepec от Май 02, 2014, 14:37
Регулярное выражение с правилами займёт больше времени выполнения, чем "просто пролетать по строке". Проверял неоднократно.
Может проверим ещё раз?
Пишите пролетайку по строке, а я напишу вариант с регулярками.
А то вы все задачи решаете, а решений что-то не видать. Одни слова.
Записан
Bepec
Гость
Re: Парсинг строки определенного типа
«
Ответ #11 :
Май 02, 2014, 15:55 »
to Old: необоснованная критика, ай ай ай
Если хотите - напишите сами варианты прогонки "с" и "без" RegExp используя только Qt
Использовать сторонние утилиты и реализации запрещено.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Парсинг строки определенного типа
«
Ответ #12 :
Май 02, 2014, 16:14 »
Сам не хочу.
По вашим "проскокам по строке" я понял, что вы легко это сможете сделать. Наверное я ошибся.
А в чем заключается критика, да ещё и не обоснованная? Я просто предложил проверить, ваше голословное заявление.
И почему такие странные ограничения по инструментам, мы хотим проверить регулярку против проскока по строке? Ну если вы захотите это проверить, а не просто "поговорить", то я готов использовать регулярку Qt.
Записан
Bepec
Гость
Re: Парсинг строки определенного типа
«
Ответ #13 :
Май 02, 2014, 16:21 »
Извиняюсь, но это раздел Qt, общие вопросы
Предложить ваш способ вы вправе, так же как и иметь своё мнение
Но человеку, ещё не освоившему Qt, предлагать осваивать буст - это бессмысленно.
PS я про
Цитата: Old от Май 02, 2014, 14:44
А то вы все задачи решаете, а решений что-то не видать. Одни слова.
. Подтверждений моих слов на форуме хватает в виде исходников в архивах, так что критика не обоснована. И в этот раз мне не хочется делать велосипед в очередной раз и без цели. Ведь я уже видел результаты
И да - проверить хотите вы. Инициатива .... инициатора.
Записан
Old
Джедай : наставник для всех
Offline
Сообщений: 4350
Re: Парсинг строки определенного типа
«
Ответ #14 :
Май 02, 2014, 16:28 »
Какой буст? Причём здесь буст?
Записан
Страниц: [
1
]
2
3
...
8
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...