Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 need regex   vilfred   31 Aug 2001 22:40:51 
 Re: need regex   Alexander Babanov   31 Aug 2001 16:40:04 
 Re: need regex   vilfred   01 Sep 2001 13:41:15 
 Re: need regex   Ruslan Bondarev   01 Sep 2001 17:38:11 
 Re: need regex   Alexander Babanov   02 Sep 2001 15:22:19 
 Re: need regex   Konstantin Stupnik   03 Sep 2001 11:12:59 
 Re: need regex   Alexander Babanov   03 Sep 2001 19:07:03 
 Re: need regex   Konstantin Stupnik   04 Sep 2001 16:39:58 
Архивное /ru.perl/648844a0ddbd.html, оценка 2 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional