用正则表达式捕获第一个匹配(C#)
这是我第一次使用C#和使用正则表达式的有限经验的一部分,我在捕获特定表达式中第一次匹配时遇到了问题。我相信下面的例子会比描述我想要做的更清楚。用正则表达式捕获第一个匹配(C#)
Match extractor = (new Regex(@".*\d(?<name>.*)\d.*")).Match("This hopefully will pick up 1Bob9error1 as a name");
Console.WriteLine(extractor.Groups["name"]);
我想这个表达式打印“鲍勃”,而不是“错误”。
我有一个预感它有什么关系?在匹配组的前面,但我不完全确定什么操作?在这种特殊情况下执行。一个解释和一些帮助将是美好的。
谢谢你们,你们不知道这个网站能帮助像我这样的初学程序员。
你的问题是贪婪。正则表达式的贪婪是。你的。*在开始时抓住了所有这些“这希望能拿起1Bob”。试试这个正则表达式代替:
\d(?<name>[^\d]+)\d
乍得,我建议你安装RegExWorkbench,http://code.msdn.microsoft.com/RegexWorkbench。这是一个古老的项目,但由Eric Gunnerson制作。如果您没有安装.NET 1.x框架,他会提供源代码,以便您可以使用您安装的框架进行编译。 – nickytonline 2009-12-01 21:26:56
这真的拿起了“鲍勃”。真棒。我认为我的问题是我对待这个正则表达式,就好像它必须匹配整个字符串,当时我真的只是问是否匹配。谢谢你一群 – Chad 2009-12-01 21:27:30
你必须记住,与正则表达式。 *可能非常邪恶。当你制作你的正则表达式时,你真的需要知道你想找到什么,只有这个。这需要时间,但一旦你一直这样做,你会以坚如磐石的正则表达式结束。我也推荐这个网站,http://www.regular-expressions.info,你读过这本书,掌握正则表达式,http://regex.info。 – nickytonline 2009-12-01 21:30:19
匹配前面的元素零次或一次。它相当于{0,1}的 。 ?是一个 贪婪的量词,其非贪婪当量是 ??。
摘自here。网站包含一个正则表达式的备忘单,看看你的表情,我似乎无法弄清楚它可能有什么问题。
我的假设是它可能与您表达的最后一次匹配。
你的表达式包围*字符造成你的麻烦。请记住,您不需要一个正则表达式,它与整个字符串相匹配 - 您只希望它在出现时仅匹配特定模式。以下代码的工作原理如下:
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"]);
(? yourRegEx)表示可以具有名称“name”的捕获组。这就是为什么你能够使用extractor.Groups [“name”] –
nickytonline
2009-12-01 21:19:35