use strict; use warnings; my $string = 'A000 A123 A567 B789 B888 B999 B000 A998 A999'; my $regex = qr/((A|B)(\d{3}))/; while ( $string =~ /$regex/g ) { if ( $2 eq 'A' ) { if ( $3 == 000 or ($3 >= 123 and $3 <= 456) or $3 == 999 ) { print "$1 valid string\n"; } else { print "$1 rejected invalid range\n" } } elsif ( $2 eq 'B' ) { if ( $3 == 000 or ($3 >= 789 and $3 <= 888) ) { print "$1 valid string\n"; } else { print "$1 rejected invalid range\n" } } else { print "$3 seems valid to me\n" } }