use strict;
my $str = 'CHE-459.288.946
IDI n. CHE-459.288.946
CHE 459.288.946
PI:01924110289 CF BGGLNI40S20I008I
LV12345678901
12345678901';
my $regex = qr/(?:(AT)\s*(U[0-9]{8}))|(?:(BE)\s*(0?[0-9]{*}))|(?:(CZ)\s*([0-9]{8,10}))|(?:(DE)\s*([0-9]{9}))|(?:(CY)\s*([0-9]{8}[A-Z]))|(?:(DK)\s*([0-9]{8}))|(?:(EE)\s*([0-9]{9}))|(?:(GR)\s*([0-9]{9}))|(?:(ES)\s*([0-9A-Z][0-9]{7}[0-9A-Z]))|(?:(FI)\s*([0-9]{8}))|(?:(FR)\s*([0-9A-Z]{2}[0-9]{9}))|(?:(GB)\s*(([0-9]{9}|[0-9]{12})~(GD|HA)[0-9]{3}))|(?:(HU)\s*([0-9]{8}))|(?:(IE)\s*([0-9][A-Z0-9\\+\\*][0-9]{5}[A-Z]))|(?:(IT)\s*([0-9]{11}))|(?:(LT)\s*(([0-9]{9}|[0-9]{12})))|(?:(LU)\s*([0-9]{8}))|(?:(LV)\s*([0-9]{11}))|(?:(MT)\s*([0-9]{8}))|(?:(NL)\s*([0-9]{9}B[0-9]{2}))|(?:(PL)\s*([0-9]{10}))|(?:(PT)\s*([0-9]{9}))|(?:(SE)\s*([0-9]{12}))|(?:(SI)\s*([0-9]{8}))|(?:(SK)\s*([0-9]{10}))|(?:\D|^)([0-9]{11})(?:\D|$)|(?:(CHE)(-|\s*)([0-9]{3}\.[0-9]{3}\.[0-9]{3}))/ip;
if ( $str =~ /$regex/g ) {
print "Whole match is ${^MATCH} and its start/end positions can be obtained via \$-[0] and \$+[0]\n";
# print "Capture Group 1 is $1 and its start/end positions can be obtained via \$-[1] and \$+[1]\n";
# print "Capture Group 2 is $2 ... and so on\n";
}
# ${^POSTMATCH} and ${^PREMATCH} are also available with the use of '/p'
# Named capture groups can be called via $+{name}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Perl, please visit: http://perldoc.perl.org/perlre.html