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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: QLineEdit  (Прочитано 10776 раз)
titan83
Гость
« Ответ #15 : Март 18, 2017, 12:53 »

щас тема опять скатится в обсуждение «регулярки/спирит vs велосипед-токенайзер»
Вы правы, поэтому, думаю, стоит тему закрывать. А то Igors сейчас погонит волну))
Записан
titan83
Гость
« Ответ #16 : Март 18, 2017, 13:22 »

Но перед закрытием улучшу свой вариант:
Код:
    QLineEdit edit;
    edit.setText("lox 123 4,5 lox100500 -34.66");
    QSet<QString> numbersList;
    QSet<QString> elementsList;
    QRegularExpressionMatchIterator i = QRegularExpression("(?<!\\S)([-]?\\d+[.,]?\\d*)(?!\\S)").globalMatch(edit.text());
    while (i.hasNext())
        numbersList.insert(i.next().captured(1));
    i = QRegularExpression("(\\S+)").globalMatch(edit.text());
    while (i.hasNext())
        elementsList.insert(i.next().captured(1));
    qDebug() << "bad set" << elementsList.subtract(numbersList);
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Март 22, 2017, 11:25 »

А то Igors сейчас погонит волну))
Улыбающийся

Но перед закрытием улучшу свой вариант:
Код:
    QLineEdit edit;
    edit.setText("lox 123 4,5 lox100500 -34.66");
    QSet<QString> numbersList;
    QSet<QString> elementsList;
    QRegularExpressionMatchIterator i = QRegularExpression("(?<!\\S)([-]?\\d+[.,]?\\d*)(?!\\S)").globalMatch(edit.text());
    while (i.hasNext())
        numbersList.insert(i.next().captured(1));
    i = QRegularExpression("(\\S+)").globalMatch(edit.text());
    while (i.hasNext())
        elementsList.insert(i.next().captured(1));
    qDebug() << "bad set" << elementsList.subtract(numbersList);
Вот есть прекрасные сишные ф-ции strtol и strtod. Они пропускают символы-пробелы, считывают число и останавливаются на символе который уже не число. Разве нельзя реализовать то же самое с QString? Неужели для простейшей задачи "считать флоты разделенные пробелами" действительно необходимы два контейнера и два итератора (да еще и обширные познания в регулярке)? В итоге все равно получился велосипед - но он просто ужасен  Улыбающийся
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #18 : Март 22, 2017, 12:42 »

А еще есть QString::split с параметром QString::SkipEmptyParts.
Получается список токенов на выходе, а их можно уже проверять на число.

Или есть QTextStream, который умеет работать со строками и через >> можно читать числа.

Но strtol и strtod, действительно, заточены именно под такую задачу Улыбающийся
« Последнее редактирование: Март 22, 2017, 12:44 от Racheengel » Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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