1

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

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

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

4

3 回答 3

3

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

^[a-zA-Z_][a-zA-Z_0-9]*
于 2013-05-20T14:38:30.133 回答
2

(disclaimer: I never tested such solution, it's only an idea)

To handle all possible values, you may use the C# compiler directly to generate on the fly the enumeration, with your values. If the compilation fails, the enum's value is not valid.

You can try the code of this 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, before understanding your requirement :

I don't think using RegEx is the right way.

What you want to do can be coded like this :

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");
        }
    }
}
于 2013-05-20T14:09:51.643 回答
1

只需为每个枚举类型构造正则表达式,如下所示:

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

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

于 2013-05-21T10:30:47.117 回答