Проблемы групп регулярных выражений C#


Извините за может быть глупый вопрос, но я не могу решить маленькую проблему и не могу найти тот же вопрос в google. Поэтому я решил написать здесь. Мне нужно разобрать те же строки:

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 значения: Здравствуйте, меня зовут ИС1 = {П 111.11, о -222.22, л 333.33, л -444.44, г 555.55} Нет 13 значение: IS1 Нет 62 Значение: Y 555.55

Еще раз прошу прощения, не могли бы вы объяснить мне почему только последняя группа идет на результат.

2 2

2 ответа:

Вы должны захватить значение группы 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

По определению повторная группа захвата будет захватывать только последнюю итерацию.
Поместите группу захвата вокруг повторяющейся группы, чтобы захватить все итерации:

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