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

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

Страниц: [1] 2 3 ... 8   Вниз
  Печать  
Автор Тема: Парсинг строки определенного типа  (Прочитано 48560 раз)
Torvald
Самовар
**
Offline 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 Offline

Сообщений: 2095



Просмотр профиля
« Ответ #1 : Май 01, 2014, 12:57 »

Цитировать
Регэкспы кажутся медленными (хотя могу ошибаться, скорость не замерял), так что пока мое решение такое:
1. Сплит строки по пробелам
2. Если элементов 4, то:
2.1. Если 0 и 2 подстроки "-Y" и "+X" соответственно, то подстроки 1 и 3 конвертируем к интам

Так предложенный вами вариант, будет ещё медленней  Улыбающийся
Не говоря уже о том, что и менее гибкий..
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Bepec
Гость
« Ответ #2 : Май 01, 2014, 17:02 »

Пролетать по строке, проверяя каждый символ. Если сочетание, то следующие символы до пробела конвертируем в число и вносим соответственно сочетанию.

Т.е. QString и indexOf или же char * и char[] Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Май 02, 2014, 05:53 »

Отрадно видеть заботу о скорости Улыбающийся Да, split создает контейнер, выделяет память на каждый эл-т - все это недешево, и за удобство придется платить производительностью. Но о каких данных идет речь? Если тех строк до 2 Mb (на глазок), то на расходы можно спокойно забить. Если "выжимать" то придется немного потрудиться и сделать базовую ф-цию напр
Код
C++ (Qt)
QStringRef NextWord( QStringRef & str ); // возвращает следующее "слово" в строке
А дальше уже несложно накрутить. Кстати разделитель может быть не только пробел но и таб.
Записан
Bepec
Гость
« Ответ #4 : Май 02, 2014, 11:10 »

Без сомнения всё может быть, но в приведённом примере разделитель пробел Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #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
Гость
« Ответ #6 : Май 02, 2014, 13:20 »

Они избыточны на таком формате по моему мнению Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #7 : Май 02, 2014, 13:55 »

Без сомнения всё может быть, но в приведённом примере разделитель пробел Улыбающийся
Откуда такая уверенность? Размер табуляции = 1 не запрещен. И Ваша логика недоступна моему пониманию: работать должен только "этот" пример или как?  Улыбающийся

для подобных задач регулярки и были придуманы
Ну как пойдет частокол слешей - то все, ховайся  Улыбающийся
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Май 02, 2014, 14:05 »

Они избыточны на таком формате по моему мнению Улыбающийся
на мой взгляд в данном случае избыточным будет это:
Пролетать по строке, проверяя каждый символ. Если сочетание, то следующие символы до пробела конвертируем в число и вносим соответственно сочетанию.
1. Сплит строки по пробелам
2. Если элементов 4, то:
2.1. Если 0 и 2 подстроки "-Y" и "+X" соответственно, то подстроки 1 и 3 конвертируем к интам
регулярка решает задачу одной строкой («правилом», как в другой теме Улыбающийся )
для подобных задач регулярки и были придуманы
Ну как пойдет частокол слешей - то все, ховайся  Улыбающийся
в С++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
Гость
« Ответ #9 : Май 02, 2014, 14:37 »

Регулярное выражение с правилами займёт больше времени выполнения, чем "просто пролетать по строке". Проверял неоднократно.

И да, ваше регулярное выражение так же "пролетает по строке", выдёргивая всё что надо Улыбающийся

to Igors: я решаю задачи. Везде. Есть задача - имеется данный формат, описания нет, есть строка. Как распарсить. Ответ дан. Дополнительные условия не приведены, следовательно посылать всех лесом, кто воскликнет - А ЕСЛИ?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Май 02, 2014, 14:44 »

Регулярное выражение с правилами займёт больше времени выполнения, чем "просто пролетать по строке". Проверял неоднократно.
Может проверим ещё раз? Улыбающийся
Пишите пролетайку по строке, а я напишу вариант с регулярками.
А то вы все задачи решаете, а решений что-то не видать. Одни слова.
Записан
Bepec
Гость
« Ответ #11 : Май 02, 2014, 15:55 »

to Old: необоснованная критика, ай ай ай Улыбающийся
Если хотите - напишите сами варианты прогонки "с" и "без" RegExp используя только Qt Улыбающийся
Использовать сторонние утилиты и реализации запрещено.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #12 : Май 02, 2014, 16:14 »

Сам не хочу. Улыбающийся
По вашим "проскокам по строке" я понял, что вы легко это сможете сделать. Наверное я ошибся.

А в чем заключается критика, да ещё и не обоснованная? Я просто предложил проверить, ваше голословное заявление.

И почему такие странные ограничения по инструментам, мы хотим проверить регулярку против проскока по строке? Ну если вы захотите это проверить, а не просто "поговорить", то я готов использовать регулярку Qt.
Записан
Bepec
Гость
« Ответ #13 : Май 02, 2014, 16:21 »

Извиняюсь, но это раздел Qt, общие вопросы Улыбающийся

Предложить ваш способ вы вправе, так же как и иметь своё мнение Улыбающийся Но человеку, ещё не освоившему Qt, предлагать осваивать буст  - это бессмысленно.

PS я про
А то вы все задачи решаете, а решений что-то не видать. Одни слова.
. Подтверждений моих слов на форуме хватает в виде исходников в архивах, так что критика не обоснована. И в этот раз мне не хочется делать велосипед в очередной раз и без цели. Ведь я уже видел результаты Улыбающийся И да - проверить хотите вы. Инициатива .... инициатора.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #14 : Май 02, 2014, 16:28 »

Какой буст? Причём здесь буст?
Записан
Страниц: [1] 2 3 ... 8   Вверх
  Печать  
 
Перейти в:  


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