[英]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.