>perl -wMstrict -le "my $range = quotemeta 'ARKYGZX'; ;; my $rng = qr{ [$range] }xms; my $not_rng = qr{ [^$range] }xms; ;; for my $s (qw( AAA RR XXK AxA xAxxYxxRx A xAx ARKYGZX XxZxGxYxKxRxA AxAxAxA xYYYYx xRRRRRx RRRR )) { my $match = $s =~ m{ \A $not_rng* $rng (?: $not_rng* $rng){1,2} $not_rng* \z }xms; printf qq{%s match : '%s' \n}, $match ? ' ' : 'NO', $s; } " match : 'AAA' match : 'RR' match : 'XXK' match : 'AxA' match : 'xAxxYxxRx' NO match : 'A' NO match : 'xAx' NO match : 'ARKYGZX' NO match : 'XxZxGxYxKxRxA' NO match : 'AxAxAxA' NO match : 'xYYYYx' NO match : 'xRRRRRx' NO match : 'RRRR'