These days I try and use Named Capture Buffers where feasible to make my regex code much easier to understand & update.
For eg. Here is one way I would do the first example shown (using Perl this time):
use 5.016;
use warnings;
use re '/x'; # ignore all whitespace in regex patterns
my $delimiter = qr/ (?<delimiter> [\-\.\s]) /;
my $prefix = qr/ (?<prefix> 1) /;
my $area_code = qr/ (?<area_code> \d{3}) /;
my $first3digits = qr/ (?<first3digits> \d{3}) /;
my $last4digits = qr/ (?<last4digits> \d{4}) /;
my $prefix_rule = qr/ ($prefix $delimiter) /;
my $area_code_rule = qr/ ($area_code | \( $area_code \)) /;
my $pattern = qr/
^
($area_code_rule | ($prefix_rule $area_code_rule))
$delimiter
$first3digits
$delimiter
$last4digits
\Z
/;
my @numbers = (
"123 555 6789",
"1-(123)-555-6788",
"(123-555-6787",
"(123).555.6786",
"123 55 6785",
);
for my $number (@numbers) {
if ($number =~ $pattern) {
print "$number is valid : ";
say join "-",
$+{prefix} || 'none',
$+{area_code},
$+{first3digits},
$+{last4digits};
}
}
Output: 123 555 6789 is valid : none-123-555-6789
1-(123)-555-6788 is valid : 1-123-555-6788
(123).555.6786 is valid : none-123-555-6786