use strict;
my $str = 'AI-1111
ASCN 1ZZ
STHL 1ZZ
TDCU 1ZZ
BBND 1ZZ
BIQQ 1ZZ
FIQQ 1ZZ
GX11 1ZZ
PCRN 1ZZ
SIQQ 1ZZ
TKCA 1ZZ
BFPO 11
ZZ 11
GE CX
KY1-1111
VG1111
MSR 1111
A1A 1AA
A1 1AA
A11 1AA
AA1 1AA
AA1A 1AA
AA11 1AA
A1A1AA
A11AA
A111AA
AA11AA
AA1A1AA
AA111AA
GIR 0AA
GIR0AA
BFPO 1
BFPO 11
BFPO 111
BFPO 1111
SAN TA1';
my $regex = qr/^(([A-Z]{1,2}\d[A-Z\d]?|ASCN|STHL|TDCU|BBND|[BFS]IQQ|PCRN|TKCA) ?\d[A-Z]{2}|BFPO ?\d{1,4}|(KY\d|MSR|VG|AI)[ -]?\d{4}|[A-Z]{2} ?\d{2}|GE ?CX|GIR ?0A{2}|SAN ?TA1)$/mip;
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