myRegex.GetGroupNames()
似乎还要返回已编号的组...如何只获取指定的组?
使用实际Match对象的解决方案也可以。
答案 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();
}
实际上,当组名和数字恰好相同时,这仍然会失败:\ 但是即使组名是数字也会成功,只要数字不是与其索引相同。