正则表达式:如何获取组名

时间:2009-07-22 06:17:31

标签: .net regex

我有一个类似于:

的.NET Regex
(?<Type1>AAA)|(?<Type2>BBB)

我正在对示例字符串使用 Matches 方法,例如"AAABBBAAA",然后迭代匹配。

我的目标是使用正则表达式匹配组找到匹配类型,因此对于此正则表达式,它将是:

  • 类型1
  • 2型
  • 类型1

我找不到任何GetGroupName方法。请帮忙。

3 个答案:

答案 0 :(得分:17)

这是你正在寻找的那种东西吗?它使用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);
            }
        }
    }
}

答案 1 :(得分:7)

如果您想要检索特定的群组名称,可以使用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);
}

答案 2 :(得分:0)

试试这个:

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