Russian Qt Forum

Qt => Общие вопросы => Тема начата: Larry от Апрель 22, 2013, 11:41



Название: Парсинг с помощью QRegExp
Отправлено: 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 последних файлов, между которыми нет дополнительных переносов строк и переводов кареток...Помогите пожалуйста....


Название: Re: Парсинг с помощью QRegExp
Отправлено: kambala от Апрель 22, 2013, 16:09
сделай без регэкспа — просто последовательно ищи 2 кавычки в строке и вырезай всё что между ними. если найдена меньше двух — пропускаешь.


Название: Re: Парсинг с помощью QRegExp
Отправлено: Larry от Апрель 22, 2013, 16:18
я так изначально и думал сделать, но потом подумал что это не эстетично и не правильно ;D...даже убил на составление регулярного выражения ;D...я с ними не раньше не разбирался...можно будет попробовать и так...


Название: Re: Парсинг с помощью QRegExp
Отправлено: Larry от Апрель 22, 2013, 16:32
а нельзя ли просто избавиться от этих переходов на новую строку и возврата кареток? я пытался с помощью remove(QregExp("[\r\n]")), но как-то не везде их убирает...


Название: Re: Парсинг с помощью QRegExp
Отправлено: Bepec от Апрель 22, 2013, 16:38
Как говорится дай пример (файл допустим с таким вот текстом), тогда и будет результат.


Название: Re: Парсинг с помощью QRegExp
Отправлено: Larry от Апрель 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());
}


Название: Re: Парсинг с помощью QRegExp
Отправлено: Bepec от Апрель 22, 2013, 17:38
http://regexpal.com/.

Закинь туда свой текст и экспериментируй.


Название: Re: Парсинг с помощью QRegExp
Отправлено: Larry от Апрель 22, 2013, 20:21
буду пробовать, спасибо большое...


Название: Re: Парсинг с помощью QRegExp
Отправлено: thechicho от Апрель 28, 2013, 21:25
QRegExp regexp("\"([^\"]+)\"");

m_ui->m_lwListScriptModule->addItem(regexp.cap(1).trimmed());