Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > Формирование регулярного выражения


Автор: Jeka from Doneck 30.9.2008, 12:40
Изучаю Perl и для наглядности делаю небольшие задания и столкнулся с проблеммой при построении регулярных выражений:

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

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

Автор: rcdimon 30.9.2008, 12:50
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;

Автор: Jeka from Doneck 30.9.2008, 13:04
rcdimon 

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

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


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

Он находит такие слова, которые разделены символом =. Левое у него становится ключом в хеше, а правое значением.

Автор: ginnie 30.9.2008, 13:09
Уважаемый Jeka from Doneck

Цитата

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


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


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

Автор: Jeka from Doneck 30.9.2008, 13:13
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 это уже не регулярные выражения.

Автор: rcdimon 30.9.2008, 13:19
Цитата

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 

Автор: Jeka from Doneck 30.9.2008, 13:31
rcdimon 

Большое спасибо за помощь, единсивенное но - у меня то ли зациклен, то ли зависает твой 1 пример, пробовал уже и просто скопировать чтоб слово в слово было. Не подскажешь в чем может быть проблема?

Автор: rcdimon 30.9.2008, 13:40
Да, ошибочка вышла. Надо было поставить параметр 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;
 }  

Автор: Jeka from Doneck 30.9.2008, 13:47
rcdimon большое спасибо!!! Теперь более менее понятно по выражениям. 

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

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

Автор: amg 8.11.2008, 14:59
Цитата(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;



Автор: MoXxX 8.11.2008, 15:29
спс, помогло и именно то что надо =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)