RegEx仅允许有效的Enum成员名称

时间:2013-05-20 14:03:01

标签: c# regex

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

我需要查看传递给我的函数的字符串是否是有效的Enum成员名称。在我的头顶,这意味着它不能包含符号(除了'_')并且不能以字母开头。现在我可以谷歌并自己解决,但我不太确定这两个规则是否是枚举成员名称的唯一规则 - 无法在网上找到任何关于它的内容。

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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");
        }
    }
}

答案 2 :(得分:1)

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

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

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