Skip to content

Comment on Advanced Regular Expression Tips and Techniques

Comments

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
AboutSource Built by g1lg1l

Hackerly is an independent reader for Hacker News, built on the public HN API. Not affiliated with Y Combinator.