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" } } #### while ( $string =~ /((?:A|B)\d{3})/g ) { if ( $1 eq 'A000' or ( $1 ge 'A123' and $1 le 'A456' ) or ( $1 ge 'A999' and $1 le 'B000' ) or ( $1 ge 'B789' and $1 le 'B888' ) ) { print "$1 matched\n"; } else { print "$1 did not match\n" } #### /(A(?:000|(?:1(?:2[0-3]|[01]\d))|[23]\d{2}|4(?:[0-4]\d|5[0-6])|999)|B(?:000|789|79\d|(?:8[0-7]\d|88[0-8]+)))/