Regex 101 Discussion I9 – Count the number of matches.







Regex 101 Exercise I9 – Count the number of matches


Given a string like:


# # 4 6 # # 7 # 45 # 43 # 65 56 2 # 4345 # # 23


 


Count how many numbers there are in this string


—–


There are a few ways to approach this problem.


In all of them, we need a way to capture the numeric parts of the string. We’ve done that before, using something like:


\d+


We can then apply that repeatedly, with code that looks something like this:


Regex regex = new Regex(“\d+”);


Match match = regex.Match(inputString);
int count = 0;


while (match.Success)
{
   count++;
   match = match.NextMatch();

}


That’s a bit ugly, however. There’s a shortcut, however, using:


MatchCollection matches = regex.Matches(inputString);
int count = matches.Count;


That gives the same result.


There’s another, more “advanced” approach we can use. The regex is more complex, and the code that you write is harder to understand, so I probably wouldn’t prefer it over the last approach.


To use it, you need to know a new piece of information about the Match class (where “new” means “something I haven’t talked about”).


In earlier examples, we used the “Groups” indexer to pull out values that we had captured. So, if we wrote something like:


(?<Digits>\d+)


We would use:


match.Groups[“Digits”].Value


to get the string.


It is possible to write a regex in which a given capture is used more that one time, and therefore corresponds to multiple strings. If we write:


(               # Start up repeating section
  (?<Digits>\d+)  # a sequence of digits


  (\D+|$)         # not digits or end


)+              # repeat match


 


We have a single regex that will match a repeating series of digits follow by non-digits, and each match is stored using the “Digits” capture.


To get at these captures, we use:


match.Captures[“Digits”]


which is a collection of captures, with each one containing the value from one of the captures. To solve our problem, we’d be interested in the length, which is:


match.Captures[“Digits”].Length


 


If you want extra credit, you can also do this by using Regex.Split(), though I’ve found that Regex.Match() is easier to use for this sort of problem.

Comments (0)