【问题标题】:RegEx to only allow valid Enum member namesRegEx 只允许有效的枚举成员名称
【发布时间】:2013-05-21 18:30:47
【问题描述】:

我以前从未使用过 RegEx,但今天出现了对它的需求。

我需要查看传递给我的函数的字符串是否是有效的 Enum 成员名称。在我的脑海中,这意味着它不能包含符号(“_”除外)并且不能以字母开头。现在我可以用谷歌搜索并自己弄清楚,但我不太确定这两条规则是否是枚举成员名称的唯一规则 - 在网上找不到任何关于它的信息。

编辑: 添加一些信息......我正在为unity3d编写一个编辑器插件。用户可以填充字符串列表,脚本将生成一个 c# 文件,其中这些字符串作为枚举的成员。然后用户可以通过代码引用枚举值。生成的枚举基本上是用户指定的 id 列表,因此在代码中他可以键入 IdEnum.SomeUserDefinedMember

【问题讨论】:

  • 您想确认它是否是有效的作为会员名?还是说它成员?
  • C# 语言规范将为您提供标识符的有效格式。见msdn.microsoft.com/en-us/library/vstudio/ms228593.aspx。特别是,请参见第 B.1.6 节。仅使用正则表达式不太可能做到这一点,因为您必须过滤掉关键字。
  • @JimMischel,我想你有答案。可以将 C# 关键字列表添加到 RegEx,但它会很丑陋且容易出错。通过对 OP 问题的一些了解,也许我们可以找到更好的方法。
  • 你有一个错字。枚举可以以字母开头,不能以数字开头。
  • @JimMischel,无需过滤掉关键字。它们是完全合法的枚举值。定义时只需要以@开头即可。

标签: c# regex


【解决方案1】:

此正则表达式应确保枚举值的名称有效

^[a-zA-Z_][a-zA-Z_0-9]*

【讨论】:

  • 不,不会。请参阅语言规范(在我对 OP 的评论中链接)。它允许 Unicode 字符和 Unicode 转义序列等。该规范还不允许在枚举中使用关键字。您的正则表达式将仅识别有效枚举的一小部分。
  • @JimMischel - 虽然这完全正确,但它将识别有效枚举的最常见子集。根据 OP 的目标,这可能就足够了。
  • “有效枚举的最常见子集”由讲英语的人编写,或者可能由西欧人编写。对于 OP 的目的,这可能确实足够了。不过,我不会将其作为通用解决方案。
  • @JimMischel - 有效点。那是非常以盎格鲁为中心的我。
【解决方案2】:

(免责声明:我从未测试过这样的解决方案,这只是一个想法)

要处理所有可能的值,您可以使用 C# 编译器直接使用您的值动态生成枚举。如果编译失败,则枚举值无效。

你可以试试这个other SO question的代码:

CodeTypeDeclaration type = new CodeTypeDeclaration("BugTracker");
type.IsEnum = true;

foreach (var valueName in new string[] { "Bugzilla", "Redmine" })
{
  // Creates the enum member
  CodeMemberField f = new CodeMemberField("BugTracker", valueName);


  type.Members.Add(f);
}

OldAnswser,在了解您的要求之前:

我不认为使用 RegEx 是正确的方法。

你想做的可以这样编码:

enum MyEnum {
    Val1,
    Val2,
    Val3

}

class MyClass {
    void Foo(){
        string someInput = "Val2";

        MyEnum candidate;

        if(Enum.TryParse(someInput, out candidate)){
            // DO something with the enum
            DoSomething(candidate);
        }
        else{
            throw new VeryBadThingsHappened("someInput is not a valid MyEnum");
        }
    }
}

【讨论】:

  • 虽然没有问得那么好,但我很确定 OP 正在寻求确保特定字符串是 C# 的有效 member name(例如,不包含空格)。
  • 我可能误解了 OP 的目标。 @Prodigga:请说明您的实际目标是什么(您想做什么,而不是如何)。
  • P请参考我在初始帖子中添加的评论!很抱歉造成混乱:)
  • 关于您的评论,我的解决方案不适用。对不起
  • 我阅读了您的新解决方案,这是一个绝妙的主意!但是,我无法让它工作。添加的成员即使无效 - 添加名为“new”的成员也不会引发任何错误。
【解决方案3】:

只需像这样为每个枚举类型构造正则表达式:

Type enumeration = ...;
var regex = enumeration.Name + "\.(" + string.Join("|", Enum.GetNames(enumeration)) + ")";

它应该匹配给定枚举的所有值。您还可以扩展它以匹配多个枚举类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多