Regex: Как получить имя группы - PullRequest
8 голосов
/ 22 июля 2009

У меня есть .NET Regex, который выглядит примерно так:

(?<Type1>AAA)|(?<Type2>BBB)

Я использую метод Matches для образца строки, например, "AAABBBAAA", а затем перебираюсовпадения.

Моя цель - найти типы совпадений, используя группу совпадений регулярных выражений, поэтому для этого регулярного выражения это будет:

  • Тип1
  • Тип2
  • Type1

Я не смог найти метод GetGroupName.Пожалуйста, помогите.

Ответы [ 3 ]

17 голосов
/ 22 июля 2009

Это то, что вы ищете? Он использует Regex.GroupNameFromNumber, поэтому вам не нужно знать имена групп вне самого регулярного выражения.

using System;
using System.Text.RegularExpressions;

class Test
{
    static void Main()
    {
        Regex regex = new Regex("(?<Type1>AAA)|(?<Type2>BBB)");
        foreach (Match match in regex.Matches("AAABBBAAA"))
        {
            Console.WriteLine("Next match:");
            GroupCollection collection = match.Groups;
            // Note that group 0 is always the whole match
            for (int i = 1; i < collection.Count; i++)
            {
                Group group = collection[i];
                string name = regex.GroupNameFromNumber(i);
                Console.WriteLine("{0}: {1} {2}", name, 
                                  group.Success, group.Value);
            }
        }
    }
}
7 голосов
/ 22 июля 2009

Если вы хотите получить определенное имя группы, вы можете использовать метод Regex.GroupNameFromNumber.

//regular expression with a named group
Regex regex = new Regex(@"(?<Type1>AAA)|(?<Type2>BBB)", RegexOptions.Compiled);

//evaluate results of Regex and for each match
foreach (Match m in regex.Matches("AAABBBAAA"))
{
    //loop through all the groups in current match
    for(int x = 1; x < m.Groups.Count; x ++)
    {
        //print the names wherever there is a succesful match
        if(m.Group[x].Success)
            Console.WriteLine(regex.GroupNameFromNumber(x));
    }
}

Кроме того, в GroupCollection имеется индексатор строк. объект, который доступен для свойства Match.Groups, это позволяет получить доступ к группе в совпадении по имени, а не по индексу.

//regular expression with a named group
Regex regex = new Regex(@"(?<Type1>AAA)|(?<Type2>BBB)", RegexOptions.Compiled);

//evaluate results of Regex and for each match
foreach (Match m in regex.Matches("AAABBBAAA"))
{
    //print the value of the named group
    if(m.Groups["Type1"].Success)
        Console.WriteLine(m.Groups["Type1"].Value);
    if(m.Groups["Type2"].Success)
        Console.WriteLine(m.Groups["Type2"].Value);
}
0 голосов
/ 22 июля 2009

Попробуйте это:

        var regex = new Regex("(?<Type1>AAA)|(?<Type2>BBB)");
        var input = "AAABBBAAA";
        foreach (Match match in regex.Matches(input))
        {
            Console.Write(match.Value);
            Console.Write(": ");
            for (int i = 1; i < match.Groups.Count; i++)
            {
                var group = match.Groups[i];
                if (group.Success)
                    Console.WriteLine(regex.GroupNameFromNumber(i));
            }    
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...