use strict;
my $str = '<Payment>
<PCard expiration="2061-04-00" name="Grainger AB" number="41111111111111114222222222222"/>
</Payment>
<PCard expiration="2022-04" number="4005-5511-2233-4450"/>
<Payment>
Space
<PCard expiration="2022-04" number="4005 5511 2233 4450"/>
Tab space
<PCard expiration="2022-04" number="4005 551122334450"/>
<PCard expiration="2022-04" number="4005 5511 2233 4450"/>
new line
<PCard expiration="2022-04" number="4005400540054005"/>
<PCard expiration="2022-04" number="4005 5511 2233 4450"/>
carriage return
<PCard expiration="2022-04" number="4005 5511 2233 4450"/>
</Payment>
combination of
<Payment>
<PCard expiration="2022-04" number="4005- 5511 -2233-4450"/>
</Payment>
<PCard expiration="2061-04-00" name="Grainger AB" number="4255726800010"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="@#@@@$@4255726800010"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="SQ#4255726800010"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="45a$4255726800010"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="12SQ%4255726800010"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="4255726800010@121212"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="4255726800010#SQ"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="4255726800010$a54"/>
<PCard expiration="2061-04-00" name="Grainger AB" number="4255726800010%SQ12"/>
<SupplierPartID>4222222222222</SupplierPartID>
<SupplierPartID> 4222222222222</SupplierPartID>
<SupplierPartID>SQ4222222222222</SupplierPartID>
<SupplierPartID>SQ134222222222222</SupplierPartID>
<SupplierPartAuxiliaryID>WWGSQ134256726800010</SupplierPartAuxiliaryID>
';
my $regex = qr/(?<!SQ\d{0}|\d|\d{2})(51\d{14}|52\d{14}|53\d{14}|54\d{14}|55\d{14}|36\d{12}|34\d{13}|37\d{13}|4\d{15}|4\d{12}|\d{4}(-|\s)\d{4}(-|\s)\d{4}(-|\s)\d{4}|\d{3}(-|\s)\d{3}(-|\s)\d{3}(-|\s)\d{3}(-|\s)\d{3}|\d{4}(-|\s)\d{6}(-\s)\d{5}|6\d{15})/mp;
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