|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Konstantin Stupnik 2:5020/400 04 Sep 2001 16:39:58 To : Alexander Babanov Subject : Re: need regex -------------------------------------------------------------------------------- "Alexander Babanov" <Alexander.Babanov@p69.f1609.n5020.z2.fidonet.org> wrote in message news:999562092@p69.f1609.n5020.z2.ftn... > ЮІ±° Quoted soap from Konstantin Stupnik to Alexander Babanov > Юґullo Konstantin! > > >> v> Дайте пожалуйста какую-нибудь интересную задачку на регекспы, а? > >> Тут пробегала пару раз: выцепить подстроку с N окружающими словами, > >> желательно по N/2 с каждой стороны, но если не хватает - побольше > >> с другой. Я понятно излагаю? :) > KS> Тут надо понять, хочется быстро, или "красиво". В принципе, если > KS> подумать как следует, и как следует поюзать perl 5.6, то можно это > KS> одним регэкспом сделать. > > Вот именно этого и хочется :) Просили задачку на регэкспы. Hу блин, хотели - получите :) В принципе, всё то же, что и до этого, только в одном RE :) Кстати, если $str большая, а $substr в конце, то этот вариант побыстрее будет. #! /usr/bin/perl use v5.6; my $test='one two three four five six seven eight nine ten eleven twelve thirteen fourteen fifteen sixteen seventeen eighteen nineteen twenty'; print '1:'.findwithsurround($test,'ten',4),"\n"; print '2:'.findwithsurround($test,'one',4),"\n"; print '3:'.findwithsurround($test,'twenty',4),"\n"; print '4:'.findwithsurround($test,'ten',5),"\n"; print '5:'.findwithsurround($test,'two',4),"\n"; print '6:'.findwithsurround($test,'ten',40),"\n"; sub findwithsurround{ use re 'eval'; my ($str,$substr,$n)=@_; my ($p,$f,$n1,$n2); if($str=~m| (\w+\s+(?{local $c1=$c1+1})){0,$n} (??{if($p){if($c1!=$n1 or $f){'(<=\S)'}}}) $substr (\s+\w+(?{local $c2=$c2+1})){0,$n} (?{if(!$p){$p=1;$n1=$c1>$n/2?int($n/2):$c1;$n2=$n-$n1; if($n2>$c2){$n1+=$n2-$c2;$n2=$c2;}if($c1+$c2<$n){$f=1;}}}) (??{if($f or $c1!=$n1 or $c2!=$n2){'(?<=\W)'}}) |xs) { return $&; } return ''; } -- Best regards, Konstantin. Brainbench MVP for perl. Отправлено через сервер Talk.Ru - http://www.talk.ru --- ifmail v.2.15dev5 * Origin: Talk.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/648844a0ddbd.html, оценка из 5, голосов 10
|