C#正则表达组麻烦

时间:2017-12-11 16:00:35

标签: c# regex regex-group

我很抱歉可能是愚蠢的问题,但我无法解决小问题,也无法在谷歌找到相同的问题。所以,我想写在这里。我需要解析相同的字符串:

string line = "HELLO MYNAME IS1 = {P 111.11, O -222.22, L 333.33, L -444.44, Y 555.55}";

我的代码是:

string line = "HELLO MYNAME IS1 = {P 111.11, O -222.22, L 333.33, L -444.44, Y 555.55}";
Regex re = new Regex(@"^HELLO MYNAME ([A-Za-z0-9]+) = {([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+}");
MatchCollection matchCollection = re.Matches(line);
foreach(Match m in matchCollection)
{
    Console.WriteLine("Match: ");
    foreach(Group gr in m.Groups)
    {
        Console.WriteLine($"No {gr.Index} Value: {gr.Value}");
    }
 }

但是我无法理解为什么输出看起来像这样:

匹配度:

否0值:你好我的名字IS1 = {P 111.11,O -222.22,L 333.33,L -444.44,Y 555.55} No 13价值:IS1 No 62价值:Y 555.55

我很抱歉,你能解释一下为什么只有最后一组才能得到结果。

2 个答案:

答案 0 :(得分:2)

根据定义,重复捕获组仅捕获最后一次迭代 在重复组周围放置捕获组以捕获所有迭代:

^HELLO MYNAME ([A-Za-z0-9]+) = {(([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+)}

答案 1 :(得分:2)

您应该获取Group 1值以获取第一个捕获组捕获的值,并获取使用第二个捕获组捕获的所有捕获

string line = "HELLO MYNAME IS1 = {P 111.11, O -222.22, L 333.33, L -444.44, Y 555.55}";
Regex re = new Regex(@"^HELLO MYNAME ([A-Za-z0-9]+) = {([A-Z]\s[+-]?[0-9]+.[0-9]+,?\s?)+}");
MatchCollection matchCollection = re.Matches(line);
foreach(Match m in matchCollection)
{
    Console.WriteLine("Match: ");
    Console.WriteLine(m.Groups[1].Value);
    foreach (Capture cap in m.Groups[2].Captures)
        Console.WriteLine($"No {cap.Index} Value: {cap.Value}");
}

请参阅C# demo

输出:

Match: 
IS1
No 20 Value: P 111.11, 
No 30 Value: O -222.22, 
No 41 Value: L 333.33, 
No 51 Value: L -444.44, 
No 62 Value: Y 555.55