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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сделать парсер?  (Прочитано 4966 раз)
Григорий
Гость
« : Сентябрь 30, 2012, 13:49 »

 Уважаемые форумчане, есть текст вида   

    text1;text2;text3"text4;text5"text6;"text7;text8"

нужно распарсить текст вот в такой вид

    text1
    text2
    text3"text4;text5"text6
    text7;text8

т.е разделителем подстрок является знак ";", но только если он не находится внутри двойных кавычек,

подскажите как сделать парсер для такого варианта, из того что успел прочитать предлагалось сканировать побайтно или использовать QRegExp, мог бы кто нибудь помочь написать для него строку?
Записан
mutineer
Гость
« Ответ #1 : Сентябрь 30, 2012, 14:20 »

Мне кажется что регулярка тут не поможет и надо парсить посимвольно
Записан
V1KT0P
Гость
« Ответ #2 : Сентябрь 30, 2012, 14:27 »

подскажите как сделать парсер для такого варианта, из того что успел прочитать предлагалось сканировать побайтно или использовать QRegExp, мог бы кто нибудь помочь написать для него строку?
Накой тут регулярка, юзай обычную примитивную функцию(работоспособность не гарантирую, просто пример как делать, сделанно наспех):
Код
C++ (Qt)
#include <QString>
#include <QStringList>
 
void parseLineToList( const QString &line, const QChar &separator, const QChar &escape, QStringList &list )
{
   size_t count = line.size();
   size_t position = 0;
   bool escapeMode = false;
   for( size_t i = 0; i < count; ++i )
   {
       if( escapeMode )
       {
           if( line[i] == escape )
           {
               escapeMode = false;
           }
       }
       else
       {
           if( line[i] == escape )
           {
               escapeMode = true;
           }
           else
           {
               if( line[i] == separator )
               {
                   if( position != i )
                   {
                       list.append( QString( line.data() + position, i - position ) );
                   }
                   position = i + 1;
               }
           }
       }
   }
   if( position != count )
   {
       list.append( QString( line.data() + position, count - position ) );
   }
}
 
int main(int argc, char *argv[])
{
   QString line = "text1;text2;text3\"text4;text5\"text6;\"text7;text8\"";
   QStringList list;
   parseLineToList( line, ';', '"', list );
   return 0;
}
« Последнее редактирование: Сентябрь 30, 2012, 14:30 от V1KT0P » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #3 : Сентябрь 30, 2012, 14:50 »

как вариант - http://www.boost.org/doc/libs/1_51_0/libs/tokenizer/escaped_list_separator.htm
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Сентябрь 30, 2012, 15:54 »

Не сочтите за бесстыдную саморекламу, просто такие задачки возникают часто

http://www.prog.org.ru/index.php?topic=22338.msg156798#msg156798
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #5 : Октябрь 03, 2012, 17:28 »

Не сочтите за бесстыдную саморекламу, просто такие задачки возникают часто

http://www.prog.org.ru/index.php?topic=22338.msg156798#msg156798
Фиг с ней, с рекламой, лишь бы по делу и помогала.
http://www.1cpp.ru/forum/YaBB.pl?num=1253874501
Итоговая регулярка для VBS:
([\d.]+(?=;))|("(([^"])|(""))*"(?=;))

Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
trot
Гость
« Ответ #6 : Октябрь 04, 2012, 08:05 »

Эта регулярка
Цитировать
([\d.]+(?=;))|("(([^"])|(""))*"(?=;))
не охватывает всех вариантов, например, если точка с запятой стоит после символа отличного от цифры, то такая точка с запятой пропускается. С помощью одного универсального регулярного выражения такую строчку
Цитировать
text1;text2;text3"text4;text5"text6;"text7;text8"
не разбить. но если все таки стоит задачи именно это сделать с помощью регулярных выражений, то надо делать так: с начало вырезаем все подстроки, потом разбиваем и далее вставляем подстроки в результирующий массив там, где они должны быть. Конечно этот вариант проигрывает с тем, что предложено выше.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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