Ramprasad wrote:
> John W. Krahn wrote:
> > Ramprasad wrote:
> >
> > > if I have
> > > my $str = 'aw bcdefaw e a rt zzz kjkjkjaw qa' ;
> > >
> > > If I wish to replace everything between 'a' and 'zzz' With 'TXT'
> > > I do
> > >
> > > $str=~s/a[^a]+zzz/aTXTzzz/;
> > > This works fine.
> > >
> > > Now if I wish to replace everything between 'aw' and 'zzz' with
> > > 'TXT' I am not able to use
> > >
> > > $str=~s/aw[^(aw)]+zzz/awTXTzzz/;
> > >
> > > I know I can use
> > > $str=~s/^(.*)aw.*?zzz/$1awTXTzzz/s;
> > >
> > > But this seems to be a very untidy way beacuse In my real
> > > program $str is an entire file in a string and could be a very
> > > long one
> > >
> > > Is there a better way
> >
> >
> > You can use positive look-behind and positive look-ahead:
> >
> > $ perl -e'
> > my $str = q/aw bcdefaw e a rt zzz kjkjkjaw qa/;
> > print "$str\n";
> > $str =~ s/(?<=\ba\b).*?(?=\bzzz\b)/TXT/;
> > print "$str\n";
> > '
> > aw bcdefaw e a rt zzz kjkjkjaw qa
> > aw bcdefaw e aTXTzzz kjkjkjaw qa
> >
> >
>
> Now How do I replace everything between the innermost 'aw' and
> 'zzz'?

Combining John's answer and a variant of Michael's:



  my $str = q/aw bcdefaw e a rt zzz kjkjkjaw qa/;

  print "$str\n";

  # Look for a string

  $str =~ s/
    (?<=aw)       # Preceded by 'aw'
    ((?!aw).)*?   # Not containing 'aw'
    (?=zzz)       # followed by 'zzz'
  /TXT/x;

  print "$str\n";

OUTPUT

  aw bcdefawTXTzzz kjkjkjaw qa


HTH,

Rob




-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to