I’ve inherited a code block that contains the following regex and I’m trying to understand how it’s getting its results.
var pattern = @"\[(.*?)\]";
var matches = Regex.Matches(user, pattern);
if (matches.Count > 0 && matches[0].Groups.Count > 1)
...
For the input user == "Josh Smith [jsmith]":
matches.Count == 1
matches[0].Value == "[jsmith]"
… which I understand. But then:
matches[0].Groups.Count == 2
matches[0].Groups[0].Value == "[jsmith]"
matches[0].Groups[1].Value == "jsmith" <=== how?
Looking at this question from what I understand the Groups collection stores the entire match as well as the previous match. But, doesn’t the regexp above match only for [open square bracket] [text] [close square bracket] so why would “jsmith” match?
Also, is it always the case the the groups collection will store exactly 2 groups: the entire match and the last match?
The
( )acts as a capture group. So the matches array has all of matches that C# finds in your string and the sub array has the values of the capture groups inside of those matches. If you didn’t want that extra level of capture jut remove the( ).