Составте регулярное выражение

Тема в разделе "WASM.HEAP", создана пользователем twgt, 11 мар 2008.

  1. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Привет. Хотел назвать тему "Помогите составить регулярное выражение", но текущее название более правдиво.

    Есть файл, состоящий из нескольких тысяч строк.
    Каждая строка состоит из элементов, разделённых пробелом.
    Пример:
    Код (Text):
    1.    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
    Теперь нужно составить правильное регулярное выражение, но мне это никогда не давалось.
     
  2. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    twgt
    прочитал N раз, но так и не понял какого формата должен быть результат?

    P.S. делите строки файла по пробелам, а полученные подстроки по последовательности типов.
     
  3. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    Да, недописал.

    Нужно получить некоторые элементы, независимо от номера, ну допустим нужны 3й и 30й элементы, хотябы в виде символов(для подсовывания их в atoi)


    Рассматривал этот вариант, но это не выход в моей ситуации, нужна портабельность относительно формата файла(того, в котором тысячи строк)
     
  4. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    twgt
    Если никто не поможет. То тут http://www.pcre.ru/eval/ можно тренироваться.
     
  5. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Если длина в байтах, то проще обойтись без регулярных выражений. Составь таблицу смещений на каждый элемент и забирай по ней нужные данные.
     
  6. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    asd
    Спасибо, даже не знал про то, что есть сайт в зоне ru

    IceStudent
    А если из ини файла считывать, туда длины не так то просто вбить. С рег. выражениями попробще.
     
  7. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    А как пробелы связаны с портабельностью? Какая разница, будет ли pcre пробелы отсчитывать, или делать это вручную?
     
  8. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    по ссылке asd стояло выражение "\S+", оно разбивает на текстовые элементы строку)
    наверное вопрос пока что снят :)
     
  9. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    r90
    Всего не усмотрел.
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    twgt
    Из ини длины? Так распарсить их проще на порядок, чем в таких условиях пытаться что-то сделать регулярками.

    И всё-таки непонятно, что за формат у тебя :) 1-6 - это " 596", 8-18 - это "D 276 "..
     
  11. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    именно так :)
    Длинны указаны по причине того, что какой-то параметр может отсутствовать, т.е. быть пробелом.

    Я вообщето думал что с pcre удобнее будет давать выдирать данные из строки.
    например pcre_чтототам(re,param1,param2,....,paramN);
    Можно ли так?
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    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", то есть, какие-то порции. В принципе, задать длины не сложно (а потом скомпилировать регулярное выражение), но смысл будет, если одно и то же выражение будет применяться не один раз. В противном случае проще как я говорил - составить таблицу длин и пробежаться по памяти руками.
     
  13. twgt

    twgt New Member

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    1.494
    IceStudent
    Придётся так и сделать. Спасибо.
     
  14. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Не знаю, может помогу этим. В Perl при помощи паттерна можно разбить поля вот так:

    Код (Text):
    1. #!/usr/bin/perl -w
    2.  
    3. use Data::Dumper;
    4.  
    5. 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';
    6.  
    7. my @a = ($a =~ /\S+/go);
    8.  
    9. print Dumper(\@a);
    Либо написать токенайзер, разбивающий строку на токены по признаку пробела.
     
  15. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    пардон, аналогичный вопрос.
    надо выбрать n-ное слово в строке.

    P.S. такое вообще возможно реализовать регулярным выражением?
     
  16. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Ну а что мешает обратиться к полученному массиву @a для извлечения элемента? Например, так: print "$a[10]\n";
     
  17. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    а как это выглядит из командной строки консольки с использованием grep'а?

    P.S. написал скрипт на tclsh ;).
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А, так у тебя не pcre, а консоль. Тогда уж проще Perl - иногда бывает проще написать скрипт, чем мудрить и ладить пачку утилит, хотя в простых случаях они решают.
     
  19. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    Нужна консоль - пожалуйста: cat "xxx.txt" | awk '{ print $10; }'.
     
  20. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    ещё вопрос.
    выражение ^.+\( выделяет часть строки до последней скобки, какое регулярное выражение выделяет часть строки до первой скобки?