in reply to Replacing consecutive tokens in 1 pass

Why are we even bothing to check for the pipes? the solution, given the data provided, is as simple as:
#!/usr/bin/perl -w use strict; my $str = "|90|93|foo|bar|91|92|95|96|906|"; $str =~ s/9([0-9]+)?/x/g; print "$str \n";

Replies are listed 'Best First'.
Re: Re: Replacing consecutive tokens in 1 pass
by OM_Zen (Scribe) on Feb 22, 2003 at 23:24 UTC
    Hi ,

    Your script gives the output |x|x|foo|bar|x|x|x|x|x|

    The post as required needs to retain the 906 and hence , one cannot do a normal "+" search on the digits and also the user string can have a 9[0-9]at any portion of the string like |868969780| , then your scripts turns it to x like this |868x| , and your script is a bit greedy and also changes the pattern to "x" .

    Hence we require to have a look_ahead and look_behind positive assertions(here regular width is ok) to have a pattern match of 9[0-9]following a "|" but not including a "|" and followed by a "|" but not including the "|" as the pattern

    $str =~ s/(?<=\|)9[0-9](?=\|)/X/g;
    This is the extended pattern that shall do it as in my previous post