in reply to Re^2: RegEx - match !foo followed by foo
in thread RegEx - match !foo followed by foo

There are the edge cases of foobar:gonkogonk and foobar:ogonkgonk, which I've added to my below test cases. You need to decide if gonkogonk and ogonkgonk should be rejected or accepted. My solution rejects the first but accepts the second case.

use strict; use Test::More tests => 6; sub ungonk { local $_ = $_[0]; if (/^(foobar:(?!gonk).{1,5})gonk$/) { return $1 } else { return undef }; }; is ungonk('foobar:hellogonk'), 'foobar:hello'; is ungonk('foobar:gonk'), undef; is ungonk('foobar:higonk'), 'foobar:hi'; is ungonk('foobar:helloworldgonk'), undef; is ungonk('foobar:gonkgonk'), undef; is ungonk('foobar:gonkogonk'), undef; is ungonk('foobar:ogonkgonk'), 'ogonk';

Update: After reading your specification again, you don't want gonk to be found within the first five characters, but it must appear at the end. I think the below program does that, and rejects :ogonkgonk and :gonkogonk.

use strict; use Test::More tests => 7; sub ungonk { local $_ = $_[0]; if (/^(foobar:(?:(?!gonk).){1,5})gonk$/) { return $1 } else { return undef }; }; is ungonk('foobar:hellogonk'), 'foobar:hello'; is ungonk('foobar:gonk'), undef; is ungonk('foobar:higonk'), 'foobar:hi'; is ungonk('foobar:helloworldgonk'), undef; is ungonk('foobar:gonkgonk'), undef; is ungonk('foobar:gonkogonk'), undef; is ungonk('foobar:ogonkgonk'), undef;

Replies are listed 'Best First'.
Re^4: RegEx - match !foo followed by foo
by Melly (Chaplain) on Mar 16, 2006 at 13:45 UTC

    Hmm, almost - and may be enough for me to work it out <thinks>...</thinks> Nope, still stuck

    foobar:ogonkgonk should return foobar:o

    Tom Melly, tom@tomandlu.co.uk

      The following passes the modified test suite.

      use strict; use Test::More tests => 7; sub ungonk { local $_ = $_[0]; if (/^(foobar:(?:(?!gonk).){1,5})gonk/) { return $1 } else { return undef }; }; is ungonk('foobar:hellogonk'), 'foobar:hello'; is ungonk('foobar:gonk'), undef; is ungonk('foobar:higonk'), 'foobar:hi'; is ungonk('foobar:helloworldgonk'), undef; is ungonk('foobar:gonkgonk'), undef; is ungonk('foobar:gonkogonk'), undef; is ungonk('foobar:ogonkgonk'), 'foobar:o';

        Many thanks! That looks like it.

        I'll play with this and make sure I understand what's going on - thanks again.

        Do you have an amazon wishlist? Anything cheap on it? ;)

        Tom Melly, tom@tomandlu.co.uk