Regex: Как получить название группы

О! Может быть только один:

Это sooo забавный, потому что это верно:)

8
задан Svante 22 July 2009 в 08:44
поделиться

3 ответа

Это то, что вы ищете? Он использует 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);
            }
        }
    }
}
17
ответ дан 5 December 2019 в 06:54
поделиться

Если вы хотите получить конкретное имя группы, вы можете использовать метод 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);
}
7
ответ дан 5 December 2019 в 06:54
поделиться

Попробуйте следующее:

        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));
            }    
        }
0
ответ дан 5 December 2019 в 06:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: