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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Парсинг с помощью QRegExp  (Прочитано 9529 раз)
Larry
Гость
« : Апрель 22, 2013, 11:41 »

Добрый день, форумчане! Помогите решить такую проблему. Есть устройство, с которого я считываю через com-порт список файлов. Мне необходимо распарсить этот список и оставить только имена файлов, которые есть в списке, вот вид списка:
Цитировать
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);
        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());
            pos += regexp.matchedLength();
            count++;
        }

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

   QScrollBar *bar = m_ui->m_teTerminal->verticalScrollBar();
   bar->setValue(bar->maximum());
}
но иногда в список заносятся не все файлы...это происходит, когда с списке файлов появляются перенос строки и возврат каретки...пытался убрать эти символы, но они все равно всплывают...на изображении видно, что устройство вернуло 16 файлов, а в список занесено 9...Если посмотреть вывод приложения, то можно увидеть появление дополнительных переносов строки...Вот как выглядит вывод, когда все файлы заносятся в список:
Цитировать
"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 последних файлов:
Цитировать
"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 последних файлов, между которыми нет дополнительных переносов строк и переводов кареток...Помогите пожалуйста....
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Апрель 22, 2013, 16:09 »

сделай без регэкспа — просто последовательно ищи 2 кавычки в строке и вырезай всё что между ними. если найдена меньше двух — пропускаешь.
Записан

Изучением 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
Larry
Гость
« Ответ #2 : Апрель 22, 2013, 16:18 »

я так изначально и думал сделать, но потом подумал что это не эстетично и не правильно Смеющийся...даже убил на составление регулярного выражения Смеющийся...я с ними не раньше не разбирался...можно будет попробовать и так...
Записан
Larry
Гость
« Ответ #3 : Апрель 22, 2013, 16:32 »

а нельзя ли просто избавиться от этих переходов на новую строку и возврата кареток? я пытался с помощью remove(QregExp("[\r\n]")), но как-то не везде их убирает...
Записан
Bepec
Гость
« Ответ #4 : Апрель 22, 2013, 16:38 »

Как говорится дай пример (файл допустим с таким вот текстом), тогда и будет результат.
Записан
Larry
Гость
« Ответ #5 : Апрель 22, 2013, 16:44 »

вот тот же метод, но с удаление символов перевода строки и каретки:
Код:
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);
        [b]strList.remove(QRegExp("[\r\n]+"));[/b]
        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());
            pos += regexp.matchedLength();
            count++;
        }

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

   QScrollBar *bar = m_ui->m_teTerminal->verticalScrollBar();
   bar->setValue(bar->maximum());
}
Записан
Bepec
Гость
« Ответ #6 : Апрель 22, 2013, 17:38 »

http://regexpal.com/.

Закинь туда свой текст и экспериментируй.
Записан
Larry
Гость
« Ответ #7 : Апрель 22, 2013, 20:21 »

буду пробовать, спасибо большое...
Записан
thechicho
Гость
« Ответ #8 : Апрель 28, 2013, 21:25 »

QRegExp regexp("\"([^\"]+)\"");

m_ui->m_lwListScriptModule->addItem(regexp.cap(1).trimmed());
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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