Xpoint
   [напомнить пароль]

Парсинг данных в скобках

Метки: [без меток]
2008-05-13 12:44:18 [обр] LzN[досье]

Помогите придумать регулярку для выдирания данных. Уже весь мозг себе сломал =(

есть данные вида
flow1{
st01{
rd01{1,2,3,4};
rd02{1,2,3,4}{1,2,3,4};
};
};
flow2{..};
flowN{..};

известно:

  1. каждая единица логической информации начинается с лат. букв после которых следуют цифры
  2. данные единицы логической информации заключены в фигурные скобки
  3. несколько потоков данных идут перечислением без разделения в фигурных скобках
  4. данные единицы логической информации заканчиваются точкой с запятой.
  5. все данные группируются ключами flowN, которые формируются по указанным выше правилам.

данные берутся из текстового файла. данные представлены веревкой, т.е. без пробелов, переносов и т.д.

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

собственно вопрос - а возможно ли?

спустя 2 часа 57 минут [обр] Михаил Кюршин aka ya-ya(67/414)[досье]
Что вы хотите получить на выходе? Не совсем ясно
спустя 1 час 54 минуты [обр] Dennis F. Latypoff aka funky_dennis(0/84)[досье]
IMHO, посимвольное наполнение скаляра с контролем скобок намного эффективнее и быстрее, чем использование регулярных выражений для данной задачи.
спустя 19 минут [обр] Green(0/6)[досье]
Всё же хочется услышать что же требуется?
спустя 2 часа 12 минут [обр] LzN[досье]
хочется - регуляркой выдергивать flowN{..};
просто, у меня фантазии уже не хватает как бы это так описать..
спустя 3 часа 49 минут [обр] Алексей Севрюков(45/1292)[досье]
LzN[досье] послушайте Дениса[досье], регулярным выражениям тут не место.
спустя 4 часа 14 минут [обр] Роман Чемисов(16/350)[досье]
LzN[досье]
Статья Lexing Your Data
спустя 7 часов [обр] Михаил Кюршин aka ya-ya(67/414)[досье]
судя по примеру, блоки flow не могут быть вложенными. Если это действительно так, то можете делать split'ом, не очень изящно, конечно, но работает:
#!/perl
my $s = "flow1{df1{1,3}};flow2{dd{1};tt{3;dd{5}}};flow3{rd01{1,2,3}; sd02{2,4}}";
my @a = split(/(flow[0-9]+)/, $s);
for (my $i=-1; $i<$#a; $i+=2) {
    print $a[$i].$a[$i+1]."\n" if $a[$i+1];
}
спустя 2 часа 51 минуту [обр] LzN[досье]
Алексей Севрюков[досье] верно в указаном примере не самое удачное использовать регулярку, ибо объемы очень большие. но, например, подобная регулярка очень пригодится при парсинге, например, конфига бинда, дхцп и т.д. =)
спустя 9 дней [обр] Lyabah_Alexander(0/3)[досье]

я когда интерпритатор паскаля читал, то очень помог курс лекций одного московского универа.

Если ваша задача вылавливать данные из скобок, то решения Михаил Кюршин aka ya-ya[досье], вполне хватит, если необходима вложенность, то решить ее элементом рекурсии.

Если задача более глобальна, то могу вам их скинуть.

Powered by POEM™ Engine Copyright © 2002-2005