in reply to Variable-width negative lookbehind

If I correctly understand the problem, you can do this using either:

$string =~ s/([^Y])X+/$1/g;
or
$string =~ s/([^YX])X+/$1/g;
depending on whether "YXX" should yield "YX" or be left unchanged.

Hugo

Replies are listed 'Best First'.
Re: Re: Variable-width negative lookbehind
by dragonchild (Archbishop) on May 05, 2004 at 14:16 UTC
    Some test cases:
    • XAA => XAA
    • YXAA => YXAA
    • YXAAXAA => YXAAAA
    • XAAXAA => XAAAA
    • VXAAXAA => VAAAA
    • AA => AA
    • YAA => YAA
    • YXX => YX

    ------
    We are the carpenters and bricklayers of the Information Age.

    Then there are Damian modules.... *sigh* ... that's not about being less-lazy -- that's about being on some really good drugs -- you know, there is no spoon. - flyingmoose

    I shouldn't have to say this, but any code, unless otherwise stated, is untested

      Crap! This almost does it, but I have to run to work. Maybe this will give you some ideas?

      #!/usr/local/bin/perl -wl use strict; use Test::More qw'no_plan'; + my %strings = ( XAA => 'XAA', YXAA => 'YXAA', YXAAXAA => 'YXAA', XAAXAA => 'XAAAA', VXAAXAA => 'VAAAA', AA => 'AA', YAA => 'YAA', YXX => 'YX', ); + while (my ($orig_string, $result) = each %strings) { my $string = $orig_string; $string = scalar reverse $string; # last or directly before a Y $string =~ s/X(?!Y|\Z)//g; $string = scalar reverse $string; is($string, $result, "$orig_string => $result"); }

      Cheers,
      Ovid

      New address of my CGI Course.

        No, that works perfectly! (I had the fourth test case wrong. It should be YXAAXAA => YXAAAA. Updated in the original node.)

        Thanks!

        ------
        We are the carpenters and bricklayers of the Information Age.

        Then there are Damian modules.... *sigh* ... that's not about being less-lazy -- that's about being on some really good drugs -- you know, there is no spoon. - flyingmoose

        I shouldn't have to say this, but any code, unless otherwise stated, is untested