繁体   English   中英

C#Regex:获取组名?

[英]C# Regex: Get group names?

myRegex.GetGroupNames()

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

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

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

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

来自MSDN

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

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

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

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

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

快乐的编码。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM