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

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

Страниц: [1] 2 3   Вниз
  Печать  
Автор Тема: QString iterator  (Прочитано 19837 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Декабрь 06, 2011, 15:53 »

Добрый день

Недавно (для отладки) потребовалось сортировать такие строки (по ключу "x")
Цитировать
color = (1.34, 0.21, 0.2),  x = 1.23e-5f,.
Конечно сделал, но хотелось бы "удобств". В данном случае можно просто найти "х =", ну так это "только данный случай" Улыбающийся Будет напр "x=" (без пробелов) или неск таких - и опять придется суетиться.

Про RegExp ничего не знаю. Наверное если люди его придумали он зачем-то нужен, но так ли уж обязательно сразу "тащить корову на баню"? А вот было бы интересно иметь итератор который пробегает строку "токен за токеном", напр
Код
C++ (Qt)
QStringIterator it(theStr);
while (it.hasNext()) {
qDebug() << *it;
++it;
}
 
Для строки выше
Цитировать
color
=
(
1.34
,
0.21
...
Все остальное я бы легко накрутил. Есть ли такой класс?

Спасибо
Записан
Aluman
Гость
« Ответ #1 : Декабрь 06, 2011, 16:07 »

На сколько я знаю нет, возможно стоит посмотреть метод QString::split, что-то подобное он позволяет сделать.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Декабрь 06, 2011, 16:14 »

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

Сообщений: 4746



Просмотр профиля WWW
« Ответ #3 : Декабрь 06, 2011, 17:34 »

Про RegExp ничего не знаю. Наверное если люди его придумали он зачем-то нужен, но так ли уж обязательно сразу "тащить корову на баню"?
если не изобретать особо изощрённые велосипеды, то тащить корову нужно. но нужно знать все возможные форматы строки (если они такие, как указаны в первом посте, не считая пустых символов, то написать регэксп легко).
Записан

Изучением 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
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Декабрь 06, 2011, 19:26 »

если не изобретать особо изощрённые велосипеды, то тащить корову нужно. но нужно знать все возможные форматы строки (если они такие, как указаны в первом посте, не считая пустых символов, то написать регэксп легко).
А "грамотная бескрылость" - еще хуже  Улыбающийся
Записан
SimpleSunny
Гость
« Ответ #5 : Декабрь 06, 2011, 19:31 »

А чем таки split не угодил?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #6 : Декабрь 06, 2011, 19:53 »

Код
C++ (Qt)
foreach (consr QString &it, string.split (' ')) {
 
}
 
Что тут не нравится?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4746



Просмотр профиля WWW
« Ответ #7 : Декабрь 06, 2011, 20:01 »

если не изобретать особо изощрённые велосипеды, то тащить корову нужно. но нужно знать все возможные форматы строки (если они такие, как указаны в первом посте, не считая пустых символов, то написать регэксп легко).
А "грамотная бескрылость" - еще хуже  Улыбающийся
не всегда нужно лезть в самые истоки. конечно, если очень важна производительность (ага, для вывода отладочных сообщений), то надо свой "узкоспециализированный" парсер писать.

а ещё кстати strtok() есть.
Код
C++ (Qt)
foreach (consr QString &it, string.split (' ')) {
 
}
 
Что тут не нравится?
тут запятая/скобка будут приписаны к числу, а не являться отдельным элементом.
Записан

Изучением 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
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Декабрь 06, 2011, 20:04 »

тут запятая/скобка будут приписаны к числу, а не являться отдельным элементом.
Этого не заметил. Тогда сплитать простым регекспом. Можно еще в сторону буста глянуть.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
BRE
Гость
« Ответ #9 : Декабрь 06, 2011, 20:10 »

Есть ли такой класс?
КонЭчно Эсть, точнее набор классов объединенных в boost.spirit Улыбающийся
Но там много C++.
Записан
vregess
Гость
« Ответ #10 : Декабрь 07, 2011, 13:31 »

Я бы начал с регулярок. Если дело пойдет дальше, и надо будет делать что-то более оптимизированное по скорости и возможностям, то копать в сторону boost.spirit и всякие antlr/lex/flex/bison.

Я не спец по таким штукам, но если я понял правильно задачу:
Код:
    QString str = "color = (1.34, 0.21, 0.2,12),  x = 1.23e-5f,. ";
    QRegExp rx("(\\w+|[+-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+f)?|[=\\(\\)])");

    int i = 0;
    while((i = rx.indexIn(str, i)) != -1)
    {
        qDebug() << rx.cap(1);
        i += rx.matchedLength();
    }

Выводит:
Код:
color
=
(
1.34
0.21
0.2
12
)
x
=
1.23e-5f
Регэксп выглядит ужасно, но все не так страшно

Выражение:
Код:
"(\\w+|[+-]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+f)?|[=\\(\\)])"

оно же без экранирующей фигни
Код:
(\w+|[+-]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+f)?|[=\(\)])

по составным частям
Код:
(
  \w+             // числобуква 1 или более повторений = идентификатор
  |                 // оператор или
  [+-]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+f)?  // число с плавающей точкой, разные вариации: 11, .0, +11.3232e+12f и тд
  |                 // оператор или
  [=\(\)]         // набор разных операторов (можно дополнить): = ( )
)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #11 : Декабрь 07, 2011, 19:48 »

А чем таки split не угодил?
Та нервирует он меня ужасно  Плачущий  Ну как это так, вызвать сотни, (может тысячи) malloc без надобности? Ладно, допустим это мои проблемы. Но ведь он и не делает что нужно - разделитель безобразно фиксирован. Чего так глупо лезть с QStringList? Как правило нужно взять первый токен и по нему смотреть - может пропустить до конца строки, может до определенного токена. Имея итератор получить list - не вопрос

КонЭчно Эсть, точнее набор классов объединенных в boost.spirit Улыбающийся
Но там много C++.
Ой напугали Улыбающийся Но здесь разговор о QString. Понятно что есть др. средства, но за их использование придется платить "переливаниями". Конечно хочется делать все однообразно.

а ещё кстати strtok() есть.
Та хоть бы аналог strtok дали для QString !! Но я его в упор не вижу (буду только рад если ошибся, "ткните носиком"). Да, есть section, можно искать "по словам", но оно все раздроблено, никак не взаимодействует  Плачущий 

kambala, я немного погорячился в своем предыдущем посте, извините.

Я бы начал с регулярок. Если дело пойдет дальше, и надо будет делать что-то более оптимизированное по скорости и возможностям, то копать в сторону boost.spirit и всякие antlr/lex/flex/bison.

Я не спец по таким штукам, но если я понял правильно задачу:
Я Вас понял, спасибо. Конечно, не так страшен черт как его малюют, и с QRegExp разобраться можно (в конце-концов прочитать Third Edition как советует букварь). Беда в том что мне придется заставлять это делать других (я не один работаю над проектом) - и этого очень хотелось бы избежать.

Ну что такого уж "страшно-невозможного" я хочу? У меня нет никакого желания тягаться с (Q)RegExp, пусть он будет в 100 раз мощнее. Но для конкретных нужд простенький (lite) тул был бы куда полезнее. Вот все сидят в каком-то редакторе для программистов (я даже не знаю в каком). Просто наберите напр

1.45e-5f,
MyClass.MyMethod()

Теперь double-clicck на 1.45.. Подсветится все исключая финальную запятую. На MyClass - тогда до точки. То есть выбирается "токен". Конечно это можно сделать (и делается) руками, но где это в Qt? Почему такой реально нужной вещи нет и приходится лезть в дебри и/или ковыряться по символам?

Спасибо
Записан
BRE
Гость
« Ответ #12 : Декабрь 07, 2011, 19:54 »

Теперь double-clicck на 1.45.. Подсветится все исключая финальную запятую.
Черт, а у меня 45e выделяет или 1.

На MyClass - тогда до точки.
А с этим справился. Улыбающийся

А если серьезно, то "токен" должен выделяется по какому то правилу известному только тебе. Это правило ты должен как-то описать... например, с помощью regexp или spirit'а или lex/bison или ...
« Последнее редактирование: Декабрь 07, 2011, 19:58 от BRE » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #13 : Декабрь 07, 2011, 20:45 »

А если серьезно, то "токен" должен выделяется по какому то правилу известному только тебе. Это правило ты должен как-то описать... например, с помощью regexp или spirit'а или lex/bison или ...
Та неужели только мне? Улыбающийся  А так
Код
C++ (Qt)
QString str("1.45e-5");
bool Ok = false;
float f = str.toFloat(&Ok);
 
почему я здесь ничего не должен? Или даже так
Код
C++ (Qt)
char * c_ctr = "1.45e-5f";
char * endP;
float d = strtod(c_ctr, &endP);
 
Я ведь не прошу чтобы мне автоматычно делали float/double. Дайте токен, дальше я разберусь
Записан
BRE
Гость
« Ответ #14 : Декабрь 07, 2011, 20:50 »

Я ведь не прошу чтобы мне автоматычно делали float/double. Дайте токен, дальше я разберусь
Ага-ага.
А почему в строке:
Цитировать
color = (1.34, 0.21, 0.2),  x = 1.23e-5f,.
ты считаешь отдельным токеном color или x? Может здесь отдельный токен - "color = (" или "x = 1."?
А как "волшебный" метод в QString должен до этого догадаться? Улыбающийся


Записан
Страниц: [1] 2 3   Вверх
  Печать  
 
Перейти в:  


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