use strict;
my $str = 'ALL strings in the first section should match
some 4270446050075048
4270-4460-5007-5048
this:4270 4460 5007 5048.
4270 4460 5007 5048 4/20
4270 4460 5007 5048 what
4270 4460 5007 5048
4270 4460 5007 5048 12/20
5105105105105100
5200828282828210
--- (the following should not match - test numbers)
5454545454545454
4123456789012345
4242424242424242
42704460500750a8
4111111111111111
5111111111111111
5555555555555555
3333333333333333
3111111111111111
--- (the following should NOT match)
4270 4460 5007 5048 1234
4270
4270 4460 5007 504
42811293test123
427044605007504812345083 5095 5179 5157 5219 5187 5095 <--- FALSE POSITIVE (contains valid CC but has lots of exra digits)
this:4270 4460 5007 50482
4270 4460 5007 5048 123
4270 4460 5007 5048 1234
Known False positive (test number):
5535 3545 5455 4444
';
my $regex = qr/\b(?<!\d.)(3[47]\d{2}([ -]?)(?!(\d)\3{5}|123456|234567|345678|424242|545454)\d{6}\2(?!(\d)\4{4})\d{5}|((4\d|5[1-5]|65)\d{2}|6011)([ -]?)(?!(\d)\8{3}|4242|5454|1234|3456|5678|2345|4567)\d{4}\7(?!(\d)\9{3})\d{4}\7\d{4})(\b|\s)(?!.\d\d)/p;
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