Regular Expressions C#

/*
Mastering Visual C# .NET
by Jason Price, Mike Gunderloy
Publisher: Sybex;
ISBN: 0782129110
*/
/*
  ExampleC_2.cs illustrates the use of groups and captures
*/
using System;
using System.Text.RegularExpressions;
public class ExampleC_2
{
  public static void Main()
  {
    // create a string containing area codes and phone numbers
    string text =
      "(800) 555-1211\n" +
      "(212) 555-1212\n" +
      "(506) 555-1213\n" +
      "(650) 555-1214\n" +
      "(888) 555-1215\n";
    // create a string containing a regular expression to
    // match an area code; this is a group of three numbers within
    // parentheses, e.g. (800)
    // this group is named "areaCodeGroup"
    string areaCodeRegExp = @"(?\(\d\d\d\))";
    // create a string containing a regular expression to
    // match a phone number; this is a group of seven numbers
    // with a hyphen after the first three numbers, e.g. 555-1212
    // this group is named "phoneGroup"
    string phoneRegExp = @"(?\d\d\d\-\d\d\d\d)";
    // create a MatchCollection object to store the matches
    MatchCollection myMatchCollection =
      Regex.Matches(text, areaCodeRegExp + " " + phoneRegExp);
    // use a foreach loop to iterate over the Match objects in
    // the MatchCollection object
    foreach (Match myMatch in myMatchCollection)
    {
      // display the "areaCodeGroup" group match directly
      Console.WriteLine("Area code = " + myMatch.Groups["areaCodeGroup"]);
      // display the "phoneGroup" group match directly
      Console.WriteLine("Phone = " + myMatch.Groups["phoneGroup"]);
      // use a foreach loop to iterate over the Group objects in
      // myMatch.Group
      foreach (Group myGroup in myMatch.Groups)
      {
        // use a foreach loop to iterate over the Capture objects in
        // myGroup.Captures
        foreach (Capture myCapture in myGroup.Captures)
        {
          Console.WriteLine("myCapture.Value = " + myCapture.Value);
        }
      }
    }
  }
}