C#Regex:获取组名?

mpe*_*pen 5 c# regex

myRegex.GetGroupNames()
Run Code Online (Sandbox Code Playgroud)

似乎也返回编号的组...如何只获得命名的组?

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

mik*_*kel 7

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

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

来自MSDN:

指定唯一有效的捕获是表单的显式命名或编号组(?<name>...).这允许未命名的括号充当非捕获组,而没有表达式的语法笨拙 (?:...).

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

  • 无论如何,命名组和编号组不应该在同一个正则表达式中使用; 这太令人困惑了.如果你不控制正则表达式的来源,你可以通过强制ExplicitCapture模式来节省很多麻烦.另外,您可能希望禁止使用*看起来像数字的组名,例如`(?<2> ...)` (2认同)
  • 当然你还会得到一个名为"0"的小组,我觉得这个小组非常偷偷摸摸而且非常不受欢迎. (2认同)

mpe*_*pen 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();
}
Run Code Online (Sandbox Code Playgroud)

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