Привет. Хотел назвать тему "Помогите составить регулярное выражение", но текущее название более правдиво. Есть файл, состоящий из нескольких тысяч строк. Каждая строка состоит из элементов, разделённых пробелом. Пример: Код (Text): 596 HD 276 00 07 13.4 -76 43 51 306 -40 7.556 0.271 2.677 0.006 3.821 -0.29 84 2.93 0.93 H 2.2 1.9 2.5 1.35 1.30 1.40 HD 276 23.0 0.3 0.5 2 381 0.216 C 7 78 -5 2 11.9 0.6 -16 -30 -19 7.962 -0.054 6.55 7.98 0.10 0.18 Мне известны длины, в байтах, отведённые под каждый элемент. Собственно вот они(их 56): Тире означает что под элемент отводятся байты с x до y (x-y) В качестве элемента может быть один символ, дробное число, знаковое число, буквы и т.д. На какой позиции элемент какого типа стоит мне тоже известно. Подключил к поекту pcre.h Теперь нужно составить правильное регулярное выражение, но мне это никогда не давалось.
twgt прочитал N раз, но так и не понял какого формата должен быть результат? P.S. делите строки файла по пробелам, а полученные подстроки по последовательности типов.
Да, недописал. Нужно получить некоторые элементы, независимо от номера, ну допустим нужны 3й и 30й элементы, хотябы в виде символов(для подсовывания их в atoi) Рассматривал этот вариант, но это не выход в моей ситуации, нужна портабельность относительно формата файла(того, в котором тысячи строк)
Если длина в байтах, то проще обойтись без регулярных выражений. Составь таблицу смещений на каждый элемент и забирай по ней нужные данные.
asd Спасибо, даже не знал про то, что есть сайт в зоне ru IceStudent А если из ини файла считывать, туда длины не так то просто вбить. С рег. выражениями попробще.
А как пробелы связаны с портабельностью? Какая разница, будет ли pcre пробелы отсчитывать, или делать это вручную?
по ссылке asd стояло выражение "\S+", оно разбивает на текстовые элементы строку) наверное вопрос пока что снят
twgt Из ини длины? Так распарсить их проще на порядок, чем в таких условиях пытаться что-то сделать регулярками. И всё-таки непонятно, что за формат у тебя 1-6 - это " 596", 8-18 - это "D 276 "..
именно так Длинны указаны по причине того, что какой-то параметр может отсутствовать, т.е. быть пробелом. Я вообщето думал что с pcre удобнее будет давать выдирать данные из строки. например pcre_чтототам(re,param1,param2,....,paramN); Можно ли так?
twgt В твоём случае получается как бы бинарный формат и регулярки мало помогут. Они могут помочь, если нужно выдрать, допустим, записи вида "2.2 1.9 2.5 1.35 1.30 1.40 HD 276", "23.0 0.3 0.5 2 381 0.216", то есть, какие-то порции. В принципе, задать длины не сложно (а потом скомпилировать регулярное выражение), но смысл будет, если одно и то же выражение будет применяться не один раз. В противном случае проще как я говорил - составить таблицу длин и пробежаться по памяти руками.
Не знаю, может помогу этим. В Perl при помощи паттерна можно разбить поля вот так: Код (Text): #!/usr/bin/perl -w use Data::Dumper; my $a = '596 HD 276 00 07 13.4 -76 43 51 306 -40 7.556 0.271 2.677 0.006 3.821 -0.29 84 2.93 0.93 H 2.2 1.9 2.5 1.35 1.30 1.40 HD 276 23.0 0.3 0.5 2 381 0.216 C 7 78 -5 2 11.9 0.6 -16 -30 -19 7.962 -0.054 6.55 7.98 0.10 0.18'; my @a = ($a =~ /\S+/go); print Dumper(\@a); Либо написать токенайзер, разбивающий строку на токены по признаку пробела.
пардон, аналогичный вопрос. надо выбрать n-ное слово в строке. P.S. такое вообще возможно реализовать регулярным выражением?
Ну а что мешает обратиться к полученному массиву @a для извлечения элемента? Например, так: print "$a[10]\n";
а как это выглядит из командной строки консольки с использованием grep'а? P.S. написал скрипт на tclsh .
А, так у тебя не pcre, а консоль. Тогда уж проще Perl - иногда бывает проще написать скрипт, чем мудрить и ладить пачку утилит, хотя в простых случаях они решают.
ещё вопрос. выражение ^.+\( выделяет часть строки до последней скобки, какое регулярное выражение выделяет часть строки до первой скобки?