Capturing the first match with regex (C#)
This is my first experience with C# and part of my limited experience with regular expressions a开发者_如何学Cnd I'm having trouble capturing the first occurrence of a match in a particular expression. I believe the following example would make it more clear than words in describing what I want to do.
Match extractor = (new Regex(@".*\d(?<name>.*)\d.*")).Match("This hopefully will pick up 1Bob9error1 as a name");
Console.WriteLine(extractor.Groups["name"]);
I would like to this expression to print "Bob" instead of "error".
I have a hunch it has something to do with the ? in front of the matching group, but I'm not exactly sure what operation the ? performs in this particular case. An explanation along with some help would be wonderful.
Thanks guys, you have no idea how much this site helps a beginning programmer like me.
Your problem is greed. Regex greediness that is. Your .* at the start grabs all this "This hopefully will pick up 1Bob" . try this Regex instead:
\d(?<name>[^\d]+)\d
Matches the preceding element zero or one time. It is equivalent to {0,1}. ? is a greedy quantifier whose non-greedy equivalent is ??.
Taken from here. Site includes a cheat-sheet for regular expressions, and looking at your expression I can't seem to figure out what may be wrong with it.
My assumption is that it might be matching the last occurrence of your expression.
Each Group item has a Captures collection, you can access the first capture for a group using:
extractor.Groups["name"].Captures[0]
The bracketing * characters around your expression are causing your trouble. Remember you don't need a regular expression that matches the entire string - you want it to match only a particular pattern when it appears. The following code works:
Regex pattern = new Regex(@"\d(?<name>.*?)\d");
MatchCollection matches = pattern.Matches("This hopefully will pick up 1Bob9error1 as a name");
Console.WriteLine(matches[0].Groups["name"]);
精彩评论