我之前从未使用过RegEx,但今天就出现了它的需求。
我需要查看传递给我的函数的字符串是否是有效的Enum成员名称。在我的头顶,这意味着它不能包含符号(除了'_')并且不能以字母开头。现在我可以谷歌并自己解决,但我不太确定这两个规则是否是枚举成员名称的唯一规则 - 无法在网上找到任何关于它的内容。
编辑: 添加一些信息......我正在为unity3d编写一个编辑器插件。用户可以填充字符串列表,脚本将生成一个c#文件,其中这些字符串作为枚举的成员。然后,用户可以通过代码引用枚举值。生成的枚举基本上是用户指定的id列表,因此在代码中他可以键入IdEnum.SomeUserDefinedMember
答案 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);
}
我不认为使用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)) + ")";
它应匹配给定枚举的所有值。您也可以展开它以匹配多个枚举类型。