C#Regex:获取组名?

时间:2010-12-29 23:16:35

标签: c# regex

myRegex.GetGroupNames()

似乎还要返回已编号的组...如何只获取指定的组?

使用实际Match对象的解决方案也可以。

3 个答案:

答案 0 :(得分:7)

在创建正则表达式时使用RegexOptions.ExplicitCapture选项可以执行您想要的操作吗?例如

Regex theRegex = new Regex(@"\b(?<word>\w+)\b", RegexOptions.ExplicitCapture);

来自MSDN

  

指定唯一有效的捕获   明确命名或编号   形式为(?<name>...)的组。这个   允许未命名的括号充当   非捕获组没有   表达的句法笨拙   (?:...)

因此,如果设置了此选项,您无需担心API的用户是否可能使用非捕获组。

答案 1 :(得分:2)

查看有关使用(?:)和/或坚持使用“一种风格”的其他评论/答案。这是我尝试直接解决问题的最佳方法:

var named = regex.GetGroupNames().Where(x => !Regex.IsMatch(x, "^\\d+$"));

但是,对于像(?<42>...)这样的正则表达式,这会失败。

快乐的编码。

答案 2 :(得分:2)

public string[] GetGroupNames(Regex re)
{
    var groupNames = re.GetGroupNames();
    var groupNumbers = re.GetGroupNumbers();

    Contract.Assert(groupNames.Length == groupNumbers.Length);

    return Enumerable.Range(0, groupNames.Length)
        .Where(i => groupNames[i] != groupNumbers[i].ToString())
        .Select(i => groupNames[i])
        .ToArray();
}

实际上,当组名和数字恰好相同时,这仍然会失败:\ 但是即使组名是数字也会成功,只要数字不是与其索引相同。