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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Формирование регулярного выражения, Для примера хочу реализовать выражение 
V
    Опции темы
Jeka from Doneck
Дата 30.9.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Изучаю Perl и для наглядности делаю небольшие задания и столкнулся с проблеммой при построении регулярных выражений:

Первое просто поиск при помощи регулярного выражения
Сформировать хеш, содержащий пары "Имя/Значение", поступившие методом GET из формы. Вывести на печать в виде строк элементы хеша.
Пример строки - file://localhost/C:/Untitled-1.html?Textlayer1=322&textlayer2=asd&But1=Start

Второе поиск и замена при помощи регулярного выражения
Преобразовать текст следующим образом: перед всеми глаголами в  неопределенной форме,  т.е. заканчивающихся на -ить, -ать , -ять,  еть,  вставить отрицание "не".


Это сообщение отредактировал(а) Jeka from Doneck - 30.9.2008, 12:41
PM MAIL   Вверх
rcdimon
Дата 30.9.2008, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



file://localhost/C:/Untitled-1.html?Textlayer1=322&textlayer2=asd&But1=Start

Ну самое элементарное, что приходит в голову по первой задачке

Код


my $str = 'file://localhost/C:/Untitled-1.html?Textlayer1=322&textlayer2=asd&But1=Start';

my %hash;

while ($str =~ m/(\w+)=(\w+)/){
    $hash{$1} = $2;
 }  


Добавлено через 9 минут и 24 секунды
По второй

Код

my $str = 'Бегал паять криать стол лететь стоять бегал';

$str =~ s/([а-яА-Я]+(ять|ать|еть))/не $1/g;

PM MAIL ICQ   Вверх
Jeka from Doneck
Дата 30.9.2008, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



rcdimon 

Скажи пожалуйста, а в коде который к 1 примеру где указано то, что разделитель значениями &  ??

Тоесть там ведь должен получится что то типа ключ[название элемента формы] = значение,  потом после & следующие ключ значение. 


PM MAIL   Вверх
rcdimon
Дата 30.9.2008, 13:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, верно. Там это не учитывается.. Если быть увереным, что на вход программы будет подана строка именно такого формата, то работать будеи и без этого. 

Он находит такие слова, которые разделены символом =. Левое у него становится ключом в хеше, а правое значением.
PM MAIL ICQ   Вверх
ginnie
Дата 30.9.2008, 13:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Уважаемый Jeka from Doneck

Цитата

столкнулся с проблеммой при построении регулярных выражений


с какой проблемой Вы столкнулись? Вообще не можете написать? или что-то работает не так? Покажите, что написали и что не работает.


rcdimon, а если textlayer2=a%20sd


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Jeka from Doneck
Дата 30.9.2008, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ginnie

Код

use locale;
$get = "";
open(ML,"2_1.txt");
while($line=<ML>)
{
  $get = $get.$line;
};

$x = index($get,"?")+1;
$rez = substr($get,$x,); 
@fields = split(/&/,$rez);
$massive_counter = @fields +0;
$hash = ();
for($i=0;$i<$massive_counter;$i++)
{
  @values = split(/=/,@fields[$i]);
  $hash {@values[0]} = @values[1];
}   

while (@Res = each %hash){
        print "\n";
        print "Key: $Res[0] = Value: $Res[1]\n";
}



вот как я поначалу для 1 задания сделал, но уж сильно много, и я так понял что substr \ split это уже не регулярные выражения.
PM MAIL   Вверх
rcdimon
Дата 30.9.2008, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

rcdimon, а если textlayer2=a%20sd


Так я же сказал-  Если быть увереным, что на вход программы будет подана строка именно такого формата

То есть работает то, что я предложил, только для предложенного примера ) Под ваш случай можно немного изменить 

Код

my $str = 'file://localhost/C:/Untitled-1.html?Textlayer1=322&textlayer2=asd&But1=Start&textlayer3=a%20sd';

my %hash;

while ($str =~ m/(\w+)=([\w%]+)/){
    $hash{$1} = $2;
 }  


 smile 
PM MAIL ICQ   Вверх
Jeka from Doneck
Дата 30.9.2008, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



rcdimon 

Большое спасибо за помощь, единсивенное но - у меня то ли зациклен, то ли зависает твой 1 пример, пробовал уже и просто скопировать чтоб слово в слово было. Не подскажешь в чем может быть проблема?
PM MAIL   Вверх
rcdimon
Дата 30.9.2008, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Да, ошибочка вышла. Надо было поставить параметр g к регулярке. Так все работает

Код

my $str = 'file://localhost/C:/Untitled-1.html?Textlayer1=322&textlayer2=asd&But1=Start&textlayer3=a%20sd';

my %hash;

while ($str =~ m/(\w+)=([\w%]+)/g){
    $hash{$1} = $2;
 }  

PM MAIL ICQ   Вверх
Jeka from Doneck
Дата 30.9.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



rcdimon большое спасибо!!! Теперь более менее понятно по выражениям. 


Это сообщение отредактировал(а) Jeka from Doneck - 30.9.2008, 13:48
PM MAIL   Вверх
amg
Дата 30.9.2008, 14:29 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(Jeka from Doneck @  30.9.2008,  13:47 Найти цитируемый пост)
Теперь более менее понятно по выражениям. 
Счастливый человек!

PM MAIL   Вверх
MoXxX
Дата 8.11.2008, 05:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



вопрос несколько по сабжу: как в split вбить фильтруемый символ, по которому производится разбиение значения, (в моем случае корень таблицы в БД) через переменную?

Это сообщение отредактировал(а) MoXxX - 8.11.2008, 05:07
PM   Вверх
amg
Дата 8.11.2008, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(MoXxX @  8.11.2008,  05:04 Найти цитируемый пост)
как в split вбить фильтруемый символ, по которому производится разбиение значения ... через переменную?

Может, я не точно понял вопрос, но вроде, все очевидно -- просто подставить переменную в регулярное выражение split'а. Например, 
Код
$str = 'file://localhost/C:/Untitled-1.html?Textlayer1=322&textlayer2=asd&But1=Start&textlayer3=a%20sd';
$div1 = '\?|&';
$div2 = '=';
($url, @pars) = split /$div1/, $str;
%hash = map {split /$div2/} @pars;



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


Новичок



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

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



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


 




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


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

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