Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Regex match multiple groups

Tags:

c#

regex

I have the following example of a string with regex which I am trying to match:

Regex: ^\d{3}( [0-9a-fA-F]{2}){3}

String to match: 010 00 00 00

My question is this - the regex matches and captures 1 group - the final 00 at the end of the string. However, I want it to match all three of the 00 groups at the end. Why doesn't this work? Surely the brackets should mean that they are all matched equally?

I know that I could just type out the three groups separately but this is just a short extract of a much longer string so that would be a pain. I was hoping that this would provide a more elegant solution but it seems my understanding is lacking somewhat!

Thanks!

like image 554
Mark Avatar asked Oct 05 '22 19:10

Mark


1 Answers

Because you have a quantifier on a capture group, you're only seeing the capture from the last iteration. Luckily for you though, .NET (unlike other implementations) provides a mechanism for retrieving captures from all iterations, via the CaptureCollection class. From the linked documentation:

If a quantifier is applied to a capturing group, the CaptureCollection includes one Capture object for each captured substring, and the Group object provides information only about the last captured substring.

And the example provided from the linked documentation:

  // Match a sentence with a pattern that has a quantifier that  
  // applies to the entire group.
  pattern = @"(\b\w+\W{1,2})+";
  match = Regex.Match(input, pattern);
  Console.WriteLine("Pattern: " + pattern);
  Console.WriteLine("Match: " + match.Value);
  Console.WriteLine("  Match.Captures: {0}", match.Captures.Count);
  for (int ctr = 0; ctr < match.Captures.Count; ctr++)
     Console.WriteLine("    {0}: '{1}'", ctr, match.Captures[ctr].Value);

  Console.WriteLine("  Match.Groups: {0}", match.Groups.Count);
  for (int groupCtr = 0; groupCtr < match.Groups.Count; groupCtr++)
  {
     Console.WriteLine("    Group {0}: '{1}'", groupCtr, match.Groups[groupCtr].Value);
     Console.WriteLine("    Group({0}).Captures: {1}", 
                       groupCtr, match.Groups[groupCtr].Captures.Count);
     for (int captureCtr = 0; captureCtr < match.Groups[groupCtr].Captures.Count; captureCtr++)
        Console.WriteLine("      Capture {0}: '{1}'", captureCtr, match.Groups[groupCtr].Captures[captureCtr].Value);
  }
like image 199
slackwing Avatar answered Oct 10 '22 02:10

slackwing