use strict;
my $str = '212 718-1234
(212)718-1234
(212) 718-1234
1(212)718-1234
1-212-718-1234
1.212.718.1234
+1-212-718-1234
+1.212.718.1234
1-212-718-1234
+1 (212) 718-1234
# 1-VALID 2-VALID 4-VALID
231 212 1234
234-235-5678 is a valid telephone number with area code 234, central office prefix (exchange) 235, and line number 5678.
12127181234
(212)7181234
# 1-INVALID 2-INVALID 4-INVALID
091 012 1234
# 1-INVALID 2-VALID 4-INVALID
081 012 1234
171 012 1234
# 1-VALID 2-VALID 4-INVALID
231 012 1234
# 1-INVALID 2-INVALID 4-VALID
091 212 1234
# 1-INVALID 2-VALID 4-VALID
081 212 1234
171 212 1234
231 555 1234
867-5309 missing area code
The number 234-911-5678 is invalid, because the central office code must not be in the form N11. 314-159-2653 is invalid, because the office code must not begin with 1. 123-234-5678 is invalid, because the NPA must not begin with 0 or 1.
1 212) 718 1234
121271812341212718123412127181234';
my $regex = qr/\b
\+?1?
(?<separator>\s|-|\.)?
(?: # area code with optional parentheses
(?<area_code>[2-9][0-8]\d)
|\((?&area_code)\)
)
(?&separator)?
(?: # exchange
(?!555)
[2-9]
(?!11)\d\d
)
(?&separator)?
\d{4} # line
\b/mxp;
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