Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения, проверить формат имени файла 
V
    Опции темы
Valeria
Дата 22.9.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



простой, наверное, вопрос, но возникла проблема:
мне нужно проверить формат имени файла.

файл должен быть таким: name1_name2_name3.txt
причем список каждого Name прилагается.
например: name1 = piter или  moskva или saratov

как тогда будет выглядеть регулярное выражение?

Код

${FILE_FORMAT} = "\^([pitermoskvasaratov]+)_([свои слова]+)_([сво слова]+)\\.txt\$";


это будет правильно? есть сомнение. может надо отдельно каждое слово?
у меня просто такой пример есть. 
PM MAIL ICQ   Вверх
amg
Дата 22.9.2006, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Вопрос не такой и простой, если возможные значения полей name брать именно из списка.
Вот такое решение, которое легко расширить до любого кол-ва полей name: строку $regexp можно формировать в цикле.
Код

my @name1 = qw(piter moskva saratov);
my @name2 = qw(zenit spartak hz);
my @name3 = qw(champion forever blabla);

my $test_name = 'piter_zenit_champion.txt';

{
  local $" = '|';
  my $regexp = "'$test_name'".' =~ /^('.
               "@name1".')_('.
               "@name2".')_('.
               "@name3".')\.txt$/';
  # print "$regexp\n";
  print "OK\n" if eval($regexp);
  die $@ if $@;
};

Можно раскомментировать # print "$regexp\n"; и посмотреть, как выглядит регулярное выражение.

PS Кажется, подсветка кода глючит


Это сообщение отредактировал(а) amg - 22.9.2006, 13:33
PM MAIL   Вверх
Valeria
Дата 22.9.2006, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



хорошо,если у меня фиксированное число полей, в каждом по три? мой вариант пойдет?

Добавлено @ 13:48 
и еще кстати, у меня третье name може содержать несколько значений!
т.е. написанных без пробелов championforeverblabla.

Добавлено @ 13:50 
и заодно, потом мне надо будет их еще и рапознать, т.е. выделить каждое слово отдельно! это как можно сделать? что-то слышала про функцию split, но вроде это не тот вариант.

Это сообщение отредактировал(а) Valeria - 22.9.2006, 13:56
PM MAIL ICQ   Вверх
amg
Дата 22.9.2006, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1145
Регистрация: 3.8.2006
Где: Новосибирск

Репутация: 38
Всего: 50



Цитата(Valeria @  22.9.2006,  13:45 Найти цитируемый пост)
хорошо,если у меня фиксированное число полей, в каждом по три? мой вариант пойдет?

Valeria, к сожадению, Ваш вариант не годится. По-порядку.
Код
${FILE_FORMAT} = "\^([pitermoskvasaratov]+)_([свои слова]+)_([сво слова]+)\\.txt\$";

[pitermoskvasaratov] - это 1 символ, представляющих собой одну из перечисленных в квадратных скобках букв. Т.е kiev, например, тоже пройдет. Нужно так:
(piter|moskva|saratov)
Потом, предположим, сформировали Вы строку ${FILE_FORMAT}. Дальше единственное, что с ней можно сделать - это воткнуть внутрь eval. Зачем, если при формировании строки нет интерполяции переменных? (Использование eval, вообще говоря, небезопасно, без необходимости не нужно). Лучше сразу составить регулярное выражение
Код
if ($file_name =~ /^(piter|moskva|saratov)_(свои|слова)_(сво|слова)\.txt$/) {
  print "$file_name - хорошее имя\n"
};

Ну и наконец (просто придирка), основоположники рекомендуют заглавными буквами называть только константы.

Добавлено @ 14:23 
Цитата(Valeria @  22.9.2006,  13:45 Найти цитируемый пост)
и еще кстати, у меня третье name може содержать несколько значений!т.е. написанных без пробелов championforeverblabla.
А как же тогда понять, что championforeverblabla - это на самом деле, например, три слова, а не одно?

Добавлено @ 14:32 
Цитата(Valeria @  22.9.2006,  13:45 Найти цитируемый пост)
и заодно, потом мне надо будет их еще и рапознать, т.е. выделить каждое слово отдельно! это как можно сделать? что-то слышала про функцию split, но вроде это не тот вариант.
Чтобы использовать split, нужно, чтобы в строку был какой нибудь признак, представимый регулярным выражением, и тогда по этому признаку строка разделится. Например, пусть этим признаком будет запятая, после которой могут быть пробелы. Тогда 
Код

$string = 'champion,forever,  blabla';
@name3 = split /,\s*/, $string;

PM MAIL   Вверх
Valeria
Дата 22.9.2006, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



сделать %name
и разобрать имя файла: 
Код

      $name{"name1"} = ${1};
      $name{"name2"} = ${2};
      $name{"name3"} = ${3};

if ($name{"name3"} =~ /.*[champion].*/) {...}


ну вот так как-нибудь?!
      

PM MAIL ICQ   Вверх
Valeria
Дата 22.9.2006, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 277
Регистрация: 16.5.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



спасибо amg,  у меня все получилось. smile 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.3736 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.