perl -wMstrict -le "my $beginning = qr{ \A FOO }xms; my $not_ending = qr{ (?! (?: BAR | BAZ) \z ) }xms; my $ending = qr{ .* \z }xms; for my $string (@ARGV) { if ($string =~ m{ $beginning $not_ending ($ending) }xms) { print qq($string accepted ('$1' to right)) } else { print qq($string rejected) } } " FOOABC FOO_BAR FOOBA FOOBAZZZZ "FOOBAR BAZ" FOOBAR FOOBAZ BARBAZ FOOABC accepted ('ABC' to right) FOO_BAR accepted ('_BAR' to right) FOOBA accepted ('BA' to right) FOOBAZZZZ accepted ('BAZZZZ' to right) FOOBAR BAZ accepted ('BAR BAZ' to right) FOOBAR rejected FOOBAZ rejected BARBAZ rejected