2014-05-17 38 views
0

我在一个正则表达式测试程序中测试了我的正则表达式,并且该语句本身显示它应该工作,但不是匹配4个对象,而是它应该只匹配1个(整个字符串)我不知道为什么它甚至这样做......关于正则表达式中多个匹配的混淆

rgx = new Regex(@"^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$"); 
matches = rgx.Matches("0.0.0.95"); 

在这一点上,如果我这样做:

foreach (Match m in matches) 
{ 
    Console.WriteLine(m.Value); 
} 

它只会显示“0.0.0.95”的时候,应该匹配0 ,0,0和95,而不是整个字符串。我在这里做错了什么?

答案 - 整个字符串的单场包含的小组比赛我一直在寻找,以这种方式访问​​:

r.r1 = Convert.ToInt32(m.Groups[1].Value); 
r.r2 = Convert.ToInt32(m.Groups[2].Value); 
r.r3 = Convert.ToInt32(m.Groups[3].Value); 
r.r4 = Convert.ToInt32(m.Groups[4].Value); 
+0

搜索关于MSDN组匹配。 – Mephy

+0

谢谢你的窍门 – wootowl

+0

我编辑了你的标题。请参阅“[应该在标题中是否包含”标签“](http://meta.stackoverflow.com/questions/19190/)”,其中共识是“不,他们不应该”。 –

回答

2

在这种情况下,你没有得到多重匹配 - 只有一个匹配在那里,但它有四个捕获组

^([0-9]+)\.([0-9]+)\.([0-9]+)\.([0-9]+)$ 
// ^^^^^^^^ ^^^^^^^^ ^^^^^^^^ ^^^^^^^^ 
// Group 1 Group 2 Group 3 Group 4 
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
//    Group 0 

有一个特殊的群体数量为零,包括整场比赛。

所以,你需要修改你的程序是这样的:

Console.WriteLine("One:'{0}' Two:'{1}' Three:'{2}' Four:'{3}'" 
, m.Groups[1].Value 
, m.Groups[2].Value 
, m.Groups[3].Value 
, m.Groups[4].Value 
);