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

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

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

Сообщений: 11445


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

Извиняюсь, но это раздел Qt, общие вопросы Улыбающийся
Нехорошо, за базар отвечать надо. А то сначала резво даете советы, посылаете лесом, а как доходит до дела - так сами в кусты.

По поводу регулярок: верю что это легко делается. Но вот что с контролем ошибок? Могу ли я предъявить юзверю напр
Цитировать
-Y 10и24 +X 1024
Error: integer expected
Это всякий раз охлаждает мой энтузиазм когда я собираюсь в конце-концов зазубрить правила/синтаксис  Улыбающийся (заметим что в варианте ТС с этим проблем нет)
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Но вот что с контролем ошибок?
Изначально нужно решить, как мы используем регулярку?
Например, есть массив данных, в которых нам нужно найти данные по шаблону (последовательность-число последовательность-число), тогда все что не попадает под этот шаблон будет просто пропущено. А можно задать шаблон и проверять каждую строку на его соответствие и если его нет выдавать сообщение об ошибке.
Если вы про второй вариант, то да - можно.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

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

А можно задать шаблон и проверять каждую строку на его соответствие и если его нет выдавать сообщение об ошибке. Если вы про второй вариант, то да - можно.
Тогда (в данном примере) какие варианты кроме чтения "слов" последовательно (подобно тому что я предложил выше) ?
Записан
Bepec
Гость
« Ответ #18 : Май 02, 2014, 17:39 »

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

PS ппц смотрю и всё печальнее становится. Ради 2 минут простейшей работы и получении опыта программирования, давайте пихать готовые решения. Написание собственных велосипедов - часть , если не 90% пути программиста.

PPS прекратите засорять тему ТС-са рассуждениями ах если бы кабы, да кабы. А то это уже 3(или 4) тема, которую вы с Igors сводите к собственным разбирательствам как же ж можно. Создайте отдельную и её продолжайте Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

PS ппц смотрю и всё печальнее становится. Ради 2 минут простейшей работы и получении опыта программирования, давайте пихать готовые решения. Написание собственных велосипедов - часть , если не 90% пути программиста.
Так и показали бы нам, свой кунг-фу. А то пару минут простейшей работы... уже бы сделали давно и сравнили. Улыбающийся

Вы без Qt не сможете сделать ничего, вообще ничего, о каких велосипедах и 90% пути программиста вы говорите? Улыбающийся
Почему то, навороченный класс QString вы готовым решением не считаете, а если вместе с QString использовать QRegExp, то это сразу становиться готовым решение, недостойным настоящего программиста. Улыбающийся
Ну так откажитесь и от QString? Но думаю без него вы эту задачу вообще не решите.

PPS прекратите засорять тему ТС-са рассуждениями ах если бы кабы, да кабы. А то это уже 3(или 4) тема, которую вы с Igors сводите к собственным разбирательствам как же ж можно. Создайте отдельную и её продолжайте Улыбающийся
Поверьте, я без вас разберусь, что и как мне делать. Подмигивающий
И ТС от этого есть польза, он развеет заблуждение о том, что регулярка медленее "проскока строки". И к тому же проще и надежней.
« Последнее редактирование: Май 02, 2014, 18:03 от Old » Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



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

на всякий случай напишу «регулярное» решение: \-Y\s*(\d+)\s*\+X\s*(\d+) Результаты будут храниться в $1 и $2 для M и N соответственно (если совпадение найдено конечно).

превратить это в C++/Qt код оставлю любознательному читателю Улыбающийся
Записан

Изучением 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
Гость
« Ответ #21 : Май 02, 2014, 18:18 »

А вот  kambala респект Веселый
to Igors, Old: инициатива .... инициатора. Вам надо, вы и сравнивайте Улыбающийся
PS задача спокойно решается с учебником по любому языку программирования за 15-30 минут. Направление задано, алгоритмы работы без регэксп приведены мной, регэксп приведён камбалой. Осталось только ТС-су потратить чуть времени Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Вот и прочли бы этот учебник - толку было бы больше, чем ерунду набирать.
Записан
Bepec
Гость
« Ответ #23 : Май 02, 2014, 18:24 »

to Old: сообщения без смысла теперь игнорю. Улыбающийся И вам удачных праздников.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

to Old: сообщения без смысла теперь игнорю. Улыбающийся
А как вы их будете набирать? А, впрочем, понятно "как". Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

Тогда (в данном примере) какие варианты кроме чтения "слов" последовательно (подобно тому что я предложил выше) ?
Как я и описал. Задаем правило (например, как написал kambala), читаем строку, матчим ее с шаблоном, если прошли, то конвертируем строки в числа, если нет - выдаем ошибку.
Записан
vizir.vs
Гость
« Ответ #26 : Май 05, 2014, 13:15 »

на всякий случай напишу «регулярное» решение: \-Y\s*(\d+)\s*\+X\s*(\d+) Результаты будут храниться в $1 и $2 для M и N соответственно (если совпадение найдено конечно).

превратить это в C++/Qt код оставлю любознательному читателю Улыбающийся

Мне кажется, что между Y и X должны быть обязательно пробелы, поэтому надо заменить \s* на \s+ после X и Y. Возможно перед +X так же обязательно нужен пробел, можно и там заменит \s* на \s+. Плюс, хорошо бы указать что это целая строка, т.е. указать в начале ^ в конце $.
Получаем ^\-Y\s+(\d+)\s+\+X\s+(\d+)$
« Последнее редактирование: Май 05, 2014, 13:17 от vizir.vs » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Как я и описал. Задаем правило (например, как написал kambala), читаем строку, матчим ее с шаблоном, если прошли, то конвертируем строки в числа, если нет - выдаем ошибку.
А что Вы можете выдать? "В строке xxx ошибка" - а где? Регулярка очень хороша для поиска по файлу(ам) когда "нет - ну значит и нет". Но во многих др случаях простецкое решение (типа как предложил ТС) может оказаться гибче и, в конечном счете, выгоднее.

Лучше быть хоть на 1 ход впереди заказчика (разумеется не надо ему об этом сообщать). Сейчас он хочет -Y и +X. А чего не +Y и не -X? Или оба X и Y могут иметь любые знаки. Или вообще без знака (+ по умолчанию). Или могут следовать в любом порядке. Или добавляется однотипная Z координата. Или любой из параметров отсутствует (или принимается по умолчанию). Во всех этих случаях Вам придется немало посуетиться с гордым/крутым "решением в 1 строку" и оно станет не таким уж простым. В то же время тупенький разбор "слово за словом" выдержит эту нагрузку без проблем.

Конечно можно возразить в стиле Верес'a - типа "мне такой задачи не давали!!!", но это несерьезно  Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



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

А что Вы можете выдать?
А вы?
Я быстро нахожу строку с ошибкой, дальше я могу ее под микроскопом проходить и выдавать полную диагностику. Улыбающийся

Лучше быть хоть на 1 ход впереди заказчика (разумеется не надо ему об этом сообщать). Сейчас он хочет -Y и +X. А чего не +Y и не -X? Или оба X и Y могут иметь любые знаки. Или вообще без знака (+ по умолчанию). Или могут следовать в любом порядке. Или добавляется однотипная Z координата. Или любой из параметров отсутствует (или принимается по умолчанию). Во всех этих случаях Вам придется немало посуетиться с гордым/крутым "решением в 1 строку" и оно станет не таким уж простым. В то же время тупенький разбор "слово за словом" выдержит эту нагрузку без проблем.
Эти умозаключения вы выдаете потому, что понятия не имеете о регулярках. Да? Улыбающийся

Конечно можно возразить в стиле Верес'a - типа "мне такой задачи не давали!!!", но это несерьезно  Улыбающийся
Так вы поступаете так же. Улыбающийся
Вспомните тему про парсер BibTex.
Записан
k0p4
Гость
« Ответ #29 : Май 05, 2014, 16:04 »

Здравствуйте, форумчане. : )
Цитировать
Может проверим ещё раз?
Тоже стало интересно. Решил сделать сравнительные тесты.
Итак приблизительные (средняя скорость) результаты по скорости выполнения (на моей виртуальной машине : ) ):

Метод ТСа:
    TS method
    Time elapsed =  206

Регексп:
     RegExp method.
     Time elapsed =  361

Файнд (моя реализация):
     Find method.
     Time elapsed =  135

Итак, РегЕкспы уверенно идут сзади. Метод ТСа так же не очень оптимальный. Итого - выигрывают велосипеды! : )

Моё мнение такое, что РегЕкспы на этой конкретной задаче не будут быстрее, ибо они избыточны. Так же не стоит забывать, что мы платим скоростью за удобство. Так что для таких мелких задач стоит использовать велосипеды, которые будут заточены под конкретную задачу.

ПС. Если кто-то заметил ошибки в коде, пожалуйста, сообщите. Я поправлю и проведу тесты повторно. Так же было-бы неплохо провести их хотя-бы на еще одной машине.

Сорцы:

Код:
#include <QCoreApplication>

#include <QVector>
#include <QStringList>
#include <QDebug>
#include <QRegExp>
#include <QElapsedTimer>

//#define TS
//#define REGEXP
//#define FIND

QVector<QString> GenerateList()
{
    QVector<QString> mVec;
    for (size_t ix = 0; ix < 100000; ++ix)
    {
        mVec.push_back(QString("-Y " + QString::number(qrand()) + " +X " + QString::number(qrand())));
    }

    return mVec;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QVector<QString> mVec = GenerateList();

    int y_value;
    int x_value;

    QElapsedTimer mTimer;
    mTimer.start();

#ifdef TS

    qDebug() << "TS method";

    foreach (const QString &line, mVec) {

        QStringList mSubLines = line.split(" ");

        // Handle error.
        if (mSubLines.size() != 4)
            continue;

        // Handle error.
        if (mSubLines.at(0) != "-Y" || mSubLines.at(2) != "+X")
            continue;
#ifdef DEBUG
        qDebug() << "First = " << mSubLines.at(1).toInt();
        qDebug() << "Second= " << mSubLines.at(3).toInt();
        qDebug() << endl;
#endif
        y_value = mSubLines.at(1).toInt();
        x_value = mSubLines.at(3).toInt();
    }

#endif

#ifdef REGEXP

    qDebug() << "RegExp method.";

    QRegExp mRegExp;
    mRegExp.setPattern("^\\-Y\\s+(\\d+)\\s+\\+X\\s+(\\d+)$");

    foreach (const QString &line, mVec) {
        // Handle error.
        if (mRegExp.indexIn(line) != -1) {
#ifdef DEBUG
            qDebug() << "First = " << mRegExp.cap(1).toInt();
            qDebug() << "Second= " << mRegExp.cap(2).toInt();
#endif
            y_value = mRegExp.cap(1).toInt();
            x_value = mRegExp.cap(2).toInt();
        }
    }

#endif

#ifdef FIND

    qDebug() << "Find method.";

    foreach (const QString &line, mVec) {
        //Handle error.
        if (!line.startsWith("-Y "))
            continue;

        int posX = 0;

        // Handle error.
        if ((posX = line.indexOf(" +X ")) == -1)
            continue;

        // len of "-Y " str.
        const int yValueStartPos = 3;

        // Position after Y value.
        int yValueEndPos = line.indexOf(" ", yValueStartPos);

        // Handle error.
        if (yValueEndPos == -1)
            continue;

#ifdef DEBUG
        // 4 is length of " +X " str.
        qDebug() << line.mid(yValueStartPos, yValueEndPos - yValueStartPos);
        qDebug() << line.mid(posX + 4, line.indexOf(" ", posX));
        qDebug() << endl;
#endif
        y_value = line.mid(yValueStartPos, yValueEndPos - yValueStartPos).toInt();
        x_value = line.mid(posX + 4, line.indexOf(" ", posX)).toInt();
    }

#endif

    qDebug() << "Time elapsed = " << mTimer.elapsed();

    return a.exec();
}
Записан
Страниц: 1 [2] 3 4 ... 8   Вверх
  Печать  
 
Перейти в:  


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