为啥 System.Text.RegularExpressions.Group 没有 Name 属性?

Posted

技术标签:

【中文标题】为啥 System.Text.RegularExpressions.Group 没有 Name 属性?【英文标题】:Why System.Text.RegularExpressions.Group has no Name property?为什么 System.Text.RegularExpressions.Group 没有 Name 属性? 【发布时间】:2012-12-11 04:30:36 【问题描述】:

在c#的正则表达式中,我们可以写一个正则表达式,给一个组赋值,例如,

(?<One>abc)

但是,在 System.Text.RegularExpressions.Group 类中,没有组名称的属性。我们得到名字的唯一方法是

System.Text.RegularExpressions.GetGroupNames()

为什么他们不能在名称的 Group 类中放置一个属性?是否有特殊原因不按设计这样做?

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

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

我想使用同一个求值器来处理基于不同正则表达式的多个替换。如果组有 name 属性,在 evaluator 内部,我可以通过查看它的名称来判断它是哪个正则表达式。但是,没有这样的属性。

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

【问题讨论】:

你的问题不是很清楚。如果您发布了您希望工作的代码类型的代码示例,这将有助于澄清您的问题。 如果你创建了正则表达式,你不应该知道组名是什么吗? 除非设计团队的某个人看到这一点,否则我们所能做的就是推测。我的猜测是,它从来没有被视为足够重要以保证开发和测试时间。 【参考方案1】:

在 API 中不提供 GroupName 背后的逻辑是,如果您通过采用 int 的索引器从 GroupCollection 检索到 Group,则该组可能不是命名一个;否则,您可能更愿意通过索引器检索它并采用string

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

【讨论】:

不幸的是,这种逻辑是有缺陷的,因为在现实世界中您需要Name 属性。例如,我正在运行从应用程序的另一个组件传递的正则表达式。在设计时我不知道正则表达式中的命名组是什么,但我仍然需要将它们拉出来以形成名称-值对。 @MgSam Regex.GetGroupNames 方法在这种情况下很有用。 不幸的是,这种方法并不是特别有用。如果您想知道给定的Group 是什么Name,那么拥有来自Regex 的名称数组(没有保证的顺序)对您没有多大好处。特别是考虑在Regex 上使用静态方法比实例化它更可取(出于缓存原因)。可以提供Name 属性,因为我已经能够通过反射检索信息。【参考方案2】:

Group Class 的文档暗示该类的最新版本确实具有 Name 属性。我的经验是这在运行时可用,但在编译时不可用(!!)我在 MSDN 论坛forum question

上问过一个关于此的问题

【讨论】:

请阅读Version Information

以上是关于为啥 System.Text.RegularExpressions.Group 没有 Name 属性?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?