RegEx只允许有效的Enum成员名

本文关键字:Enum 成员 有效 许有效 RegEx | 更新日期: 2023-09-27 18:14:42

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

我需要查看传入函数的字符串是否是有效的Enum成员名。在我的脑海中,这意味着它不能包含符号(除了"_"),也不能以字母开头。现在我可以谷歌一下,自己弄清楚,但我不太确定这两个规则是否是enum成员名的唯一规则——在网上找不到任何关于它的信息。

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

RegEx只允许有效的Enum成员名

这个正则表达式应该确保枚举值

的名称是有效的
^[a-zA-Z_][a-zA-Z_0-9]*

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

要处理所有可能的值,您可以使用c#编译器直接在运行中生成带有您的值的枚举。如果编译失败,则枚举的值无效。

你可以试试下面这个问题的代码:

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");
        }
    }
}

为每个枚举类型构建regex:

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

应该匹配给定枚举的所有值。您还可以将其展开以匹配多个enum类型。