2012-12-25 45 views
2

在C#的正则表达式,我们可以写一个正则表达式和分配一个名称的一组,例如,为什么System.Text.RegularExpressions.Group没有Name属性?

(?<One>abc) 

然而,在类System.Text.RegularExpressions.Group,存在用于无属性团队名字。我们能得到名字的唯一方法是

System.Text.RegularExpressions.GetGroupNames() 

为什么他们不能把名称中的属性放在Group类中?有没有设计不这样做的特别原因?

编辑: 我遇到了这个问题,当我尝试使用以下功能:

Regex.Replace(string input, 
string pattern, 
MatchEvaluator evaluator 
) 

我想用一样的一个评估多个顶替根据不同的正则表达式来处理。如果组中有一个名称属性,那么在内部评估程序中,我可以通过查看它的名称来判断它是哪个正则表达式。但是,没有这样的财产。

我最终通过使用闭包并使用GetGroupNames来完成它,但我仍然认为它应该具有name属性。如果该组没有名称,则该属性可以为空。

+0

您的问题不是很清楚。如果你发布了你希望工作的那种代码的代码示例,这将有助于澄清你的问题。 –

+0

如果你创建了正则表达式,你不知道组名是什么吗? –

+0

除非设计团队的人看到这一切,否则我们可以做的就是推测。我的猜测是,从未被认为足够重要,以保证开发和测试时间。 – tvanfosson

回答

4

后面的API中未给出Group一个Name的逻辑是,如果已经从GroupCollection通过接受一个int,则该组可能的索引中检索到的Group未命名的一个;否则,您可能更愿意通过索引器检索string

另一方面,如果您已通过索引器检索组string,那么您已经知道该组的名称。

+0

不幸的是,这个逻辑是有缺陷的,因为有真实世界的场景,你需要一个Name属性。例如,我正在运行从应用程序的另一个组件传递的正则表达式。我在设计时不知道正则表达式中的命名组是什么,但我仍然需要将它们拉出来制作名称 - 值对。 – MgSam

+0

@MgSam ['Regex.GetGroupNames'](http://msdn.microsoft.com/zh-cn/library/system.text.regularexpressions.regex.getgroupnames.aspx)方法在这种情况下很有用。 – dasblinkenlight

+0

不幸的是,这种方法并不是特别有用。如果你想要知道给定的'Group'是什么'Name',那么'Regex'有一个名称(不保证顺序)的数组对你来说并不是很好。特别是考虑在'Regex'上使用静态方法比实例化更好(为了缓存的原因)。这将有可能提供一个名称属性,因为我已经能够通过反射来检索信息。 – MgSam

0

Group Class的文档意味着该类的最新版本的确具有Name属性。我的经验是,这是可以在运行时,但不是在编译时(!!)我已经在MSDN论坛上提出有关此问题forum question

+0

请阅读[**版本信息**](https://msdn.microsoft.com/library/system.text.regularexpressions.group.name.aspx#Anchor_1)。 – PetSerAl

相关问题