Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения 
:(
    Опции темы
vlarry
Дата 25.4.2013, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Добрый день, форумчане! Помогите пожалуйста решить проблему с разбором текста с помощью регулярных выражений. Суть вот в чем: с устройства получаю список файлов в таком формате:
    AT#LSCRIPT

    #LSCRIPT: "AaStart.py",625
    #LSCRIPT: "Alarm.pyo",2921
    #LSCRIPT: "Alias.pyo",111
    #LSCRIPT: "Cache.pyo",2491
    #LSCRIPT: "Config.ini",680
    #LSCRIPT: "Config.pyo",8750
    #LSCRIPT: "Float.pyo",4470
    #LSCRIPT: "Func.pyo",3125
    #LSCRIPT: "GPSInt.pyo",4146
    #LSCRIPT: "History.pyo",4064
    #LSCRIPT: "IO.pyo",3477
    #LSCRIPT: "IPInt.pyo",6723
    #LSCRIPT: "main2.pyo",13429
    #LSCRIPT: "main3.pyo",10934
    #LSCRIPT: "SPIIO.pyo",9432
    #LSCRIPT: "xID.ini",11
    #LSCRIPT: free bytes: 1925316

    OK
мне из этого списка надо вытянуть имена файлов и я это делаю с помощью следующего метода:
Код

void CGPSTerminal::slotReadData()
{
    QByteArray data = m_port->readAll();

    if(m_currentTerminal && CGPSTerminal::MAIN_TERMINAL)
        m_ui->m_teTerminal->insertPlainText(QString(data));

    if(m_currentTerminal && CGPSTerminal::MODULE_TERMINAL)
    {
        m_ui->m_lwListScriptModule->clear();
        m_ui->m_leCountFiles->clear();

        QString strList = QString(data);
        strList.remove(QRegExp("[\r\n]+"));
        QRegExp regexp("\"([A-Za-z0-9\\.]+)\"");

        qDebug() << strList;

        int pos = 0, count = 0;

        while((pos = regexp.indexIn(strList, pos)) != -1)
        {
            m_ui->m_lwListScriptModule->addItem(regexp.cap(1)); 
            pos += regexp.matchedLength();
            count++;
        }

        m_ui->m_leCountFiles->setText(QString::number(count));
    }

   QScrollBar *bar = m_ui->m_teTerminal->verticalScrollBar();
   bar->setValue(bar->maximum());
}

но если попробовать несколько раз получить список, то часто в список m_ui->m_lwListScriptModule помещаются не все файлы. Как оказалось проблема заключается в том, что удаляются не все переходы на новую строку и возврат каретки методом strList.remove(QRegExp("[\r\n]+"));. И это происходит не всякий раз. Могу произвести получение файлов несколько раз и все нормально, но рано или поздно это проявляется...Помогите пожалуйста решить эту проблему! Как можно корректно удалить все эти переходы? 
PM MAIL   Вверх
math64
Дата 25.4.2013, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Ищи:
"#LSCRIPT: \"([A-Za-z0-9]+\.[A-Za-z0-9]+)\",(\d+)"

cap(1) будет имя файла, cap(2).toInt() - длина.

Добавлено через 4 минуты и 21 секунду
А зачем вообще удалять переводы строк?
PM   Вверх
vlarry
Дата 26.4.2013, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



извините, что не отвечал, только сейчас добрался до компьютера...сейчас проверю выражение....а с переходами, почему-то не хочет выводить все файлы в список....

Добавлено через 11 минут и 21 секунду
проверил выражение, но лучше не стало, все равно список полностью строиться через раз, а потеря файлов как раз и происходит, когда появляются лишние пробелы...что ему еще не хватает?! На рисунке правильная работа при обработке списка файлов...вот то что выводится в консоль через qDebug():
    "AT" 
    "#LSCRIPT

    #LSCRIPT: "AaStart.py",625
    #LSCRIPT: "Alarm.pyo",2921
    #LSCRIPT: "Alias.pyo",111
    #LSCRIPT: "Cache.pyo",2491
    #LSCRIPT: "Config.ini",680
    #LSCRIPT: "Config.pyo",8750
    #LSCRIPT: "Float.pyo",4470
    #LSCRIPT: "Func.pyo",3125
    #LSCRIPT: "GPSInt.pyo",4146
    #LSCRIPT: "History.pyo",4064
    #LSCRIPT: "IO.pyo",3477
    #LSCRIPT: "IPInt.pyo",6723
    #LSCRIPT: "main2.pyo",13429
    #LSCRIPT: "main3.pyo",10934
    #LSCRIPT: "SPIIO.pyo",9432
    #LSCRIPT: "xID.ini",11
    #LSCRIPT: free bytes: 1925316

    OK
    "


Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  module1.jpg 357,03 Kb
PM MAIL   Вверх
vlarry
Дата 26.4.2013, 08:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



а вот вид неправильной работы и вывод в консоль:
    "AT" 
    "#LSCRIPT

    #LSCRIPT: "AaStart.py",625
    #LSCRIPT: "Alarm.pyo",2921
    #LSCRIPT: "Alias.pyo",111
    #LSCRIPT: "Cache.pyo",2491
    #LSCRIPT: "Config.ini",680
    #LSCRIPT: "Config.pyo",8750
    #LSCRIPT: "Float.pyo",4470

    "#LSCRIPT: "Func.pyo",3125
    #LSCRIPT: "GPSInt.pyo",4146
    #LSCRIPT: "History.pyo",4064
    #LSCRIPT: "IO.pyo",3477
    #LSCRIPT: "IPInt.pyo",6723
    #LSCRIPT: "main2.pyo",13429
    #LSCRIPT: "main3.pyo",10934
    #LSCRIPT: "SPIIO.pyo",9432
    #LSCRIPT: "xID.ini",11
    #LSCRIPT: free bytes: 1925316

    OK
    "
здесь как раз видно, что появился лишний переход строки и в список вывелись последние 9 файлов, а первая часть не попала....

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  module2.jpg 411,13 Kb
PM MAIL   Вверх
math64
Дата 26.4.2013, 09:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Проблема не в RegExp. Твой первоначальный тоже рулит. Переводы строк убирать не надо - они в RegExpе пробельные символы - "\\s".
Вероятно, данные принимаются не за один slotReadData(), а за несколько.
А ты каждый раз делаешь очистку списка.
Нужно соединять принятые данные,  искать начало "AT\\s*#LSCRIPT" и конец "OK" передачи и между ними искать имена файлов.

Это сообщение отредактировал(а) math64 - 26.4.2013, 09:54
PM   Вверх
vlarry
Дата 26.4.2013, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



спасибо, попробую...уже думал попробовать распарсить построчно, разбив split-ом в список...
PM MAIL   Вверх
math64
Дата 26.4.2013, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



NB: AT и OK могут встретиться внутри имени файла, так что ищи их соответственно.
PM   Вверх
vlarry
Дата 26.4.2013, 10:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



спасибо, учту...
PM MAIL   Вверх
vlarry
Дата 26.4.2013, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



отменил очистку списка и да действительно все файлы сыпятся в список без проблем...получается прием файлов от устройства идет не одним списком, как вы, math64 и предполагали...Чтобы придумать, чтобы список обрабатывался только когда он целиком получен?
PM MAIL   Вверх
math64
Дата 26.4.2013, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Так я уже говорил: конец списка определяеться по получению "\r\nOK\r\n", а начало - по "AT".
Принимать все можешь даже по одному байту.
PM   Вверх
vlarry
Дата 26.4.2013, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



спасибо, я прописал strList.contains(QRegExp("(^AT)")); и strList.contains(QRegExp("(OK$)")); и получилось что он конец списка по OK не находил...сейчас добавил символ перехода, то все нормально, нашел OK..., буду дальше строки разбирать...спасибо...

Это сообщение отредактировал(а) vlarry - 26.4.2013, 16:11
PM MAIL   Вверх
math64
Дата 26.4.2013, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



^ и $ - ?по умолчанию? начало и конец QString, поэтому они в данном случае бесполезны.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0682 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.