我想验证脚本引擎的一些C#源代码。我想确保只有System.Math类成员可能被引用。我正在尝试创建一个正则表达式,该正则表达式将匹配一个点,后跟一个大写字母,后跟任意数量的单词字符,以不以System.Math开头的单词边界结束。正则表达式头痛
我开始用这样的:
(?<!Math)\.[A-Z]+[\w]*
工作正常进行:
return Math.Max(466.89/83.449 * 5.5); // won’t flag this
return Xath.Max(466.89/83.449 * 5.5); // will flag this
它正确地匹配。最大时,它不是由数学之前。但是,现在我试图扩展正则表达式来包含System,我无法使其正常工作。
我已经试过正则表达式的这些排列多:
((?<!System\.Math)\.[A-Z]+[\w]*)
((?<!(?<!System)\.Math)\.[A-Z]+[\w]*)
((?<!System)\.(?<!Math)\.[A-Z]+[\w]*)
((?<!System)|(?<!Math)\.[A-Z]+[\w]*)
((?<!System\.Math)|(?<!Math)\.[A-Z]+[\w]*)
使用这些语句:
return System.Math.Max(466.89/83.449 * 5.5);
return System.Xath.Max(466.89/83.449 * 5.5);
return Xystem.Math.Max(466.89/83.449 * 5.5);
我已经试过了我能想到的一切,但它要么始终匹配第二个元素(上面的.Math或.Xath)或它不匹配任何。
如果有人会怜悯我,并指出我做错了什么,我会大大appit它。
由于提前, 韦尔顿
我以为肯定我有一个解决方案,但现在我重新发现了所有列出的表达式,并破坏了我的大脑。确实非常棘手! – 2010-08-13 00:35:53
'Math.'会独自出现,还是总是以'System.'开头? – 2010-08-13 00:36:17
您是否考虑过使用编译器(CSharpCodeProvider),然后使用CodeDom对象图来扫描除System.Math之外的其他引用?这将是防弹,更可读,更灵活。 – 2010-08-13 00:39:10