对正则表达式中多个匹配的困惑

时间:2014-05-17 02:49:52

标签: c# regex

我在正则表达式测试器中测试了我的正则表达式并且语句本身似乎应该正常工作,但是它不应该匹配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而不是整个字符串。我在这里做错了什么?

ANSWER - 整个字符串的单个匹配包含我正在寻找的组匹配,以这种方式访问​​:

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

1 个答案:

答案 0 :(得分: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
);