用正则表达式捕获第一个匹配(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"]); 

我想这个表达式打印“鲍勃”,而不是“错误”。

我有一个预感它有什么关系?在匹配组的前面,但我不完全确定什么操作?在这种特殊情况下执行。一个解释和一些帮助将是美好的。

谢谢你们,你们不知道这个网站能帮助像我这样的初学程序员。

+0

(? yourRegEx)表示可以具有名称“name”的捕获组。这就是为什么你能够使用extractor.Groups [“name”] – nickytonline 2009-12-01 21:19:35

你的问题是贪婪。正则表达式的贪婪是。你的。*在开始时抓住了所有这些“这希望能拿起1Bob”。试试这个正则表达式代替:

\d(?<name>[^\d]+)\d 
+0

乍得,我建议你安装RegExWorkbench,http://code.msdn.microsoft.com/RegexWorkbench。这是一个古老的项目,但由Eric Gunnerson制作。如果您没有安装.NET 1.x框架,他会提供源代码,以便您可以使用您安装的框架进行编译。 – nickytonline 2009-12-01 21:26:56

+0

这真的拿起了“鲍勃”。真棒。我认为我的问题是我对待这个正则表达式,就好像它必须匹配整个字符串,当时我真的只是问是否匹配。谢谢你一群 – Chad 2009-12-01 21:27:30

+0

你必须记住,与正则表达式。 *可能非常邪恶。当你制作你的正则表达式时,你真的需要知道你想找到什么,只有这个。这需要时间,但一旦你一直这样做,你会以坚如磐石的正则表达式结束。我也推荐这个网站,http://www.regular-expressions.info,你读过这本书,掌握正则表达式,http://regex.info。 – nickytonline 2009-12-01 21:30:19

匹配前面的元素零次或一次。它相当于{0,1}的 。 ?是一个 贪婪的量词,其非贪婪当量是 ??。

摘自here。网站包含一个正则表达式的备忘单,看看你的表情,我似乎无法弄清楚它可能有什么问题。

我的假设是它可能与您表达的最后一次匹配。

+0

我可能是错的,但我不认为呢?在这种情况下是量词。量词不是通常遵循一个表达式吗? – Chad 2009-12-01 21:22:55

+0

这个表达没有什么错,他只是看着它捕获的第二个值,而不是第一个值。 – Rory 2009-12-01 21:23:01

+0

@查德?在此上下文中指示已命名组(更具体而言是名为“name”的组)的开始。在大多数其他地方,它被用作量词。 – Rory 2009-12-01 21:25:05

每个组项目有一个捕获集合,可以访问第一个捕获使用一组:

extractor.Groups["name"].Captures[0] 
+0

P.S.每个Capture项目都有一个Value属性,它返回捕获的实际字符串值,还有一些其他有用的属性,如捕获以原始字符串开始的索引和捕获的长度。如有疑问,请点击F1。 – Rory 2009-12-01 21:21:37

+0

嗯...有用的信息,但捕捉[0]仍然会出现“错误” 正则表达式有什么问题吗? – Chad 2009-12-01 21:21:44

你的表达式包围*字符造成你的麻烦。请记住,您不需要一个正则表达式,它与整个字符串相匹配 - 您只希望它在出现时仅匹配特定模式。以下代码的工作原理如下:

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"]);