我有一个.cs文件,其中包含以下代码
namespace Automate
{
class Class1
{
public string GetString
{
get;
set;
}
private bool flag1;
private bool flag2;
public void Method(bool param1)
{
bool flag = false;
}
}
class Class2
{
private bool flag1;
private bool flag2;
public void Method(bool param1)
{
bool flag = false;
}
}
}
现在我需要一个Regex Expression,它返回每个方法名称,属性名称和全局变量及其关联的类名和命名空间。
任何人都可以告诉我任何可能的解决方案或想法。
提前致谢
答案 0 :(得分:0)
不要使用正则表达式进行此类分析。您将无法构建强大的解析器(例如,使用完全限定类型名称返回结果的方法,返回泛型类型的泛型方法等。但当然所有这些都取决于您的任务的具体情况)。
如果您在.NET 4.5下开发,我会使用Roslyn - 这是完成此类工作的完美工具,开始时相对容易。另一种方法是编写一个简单的tokenizer并用它来收集类结构。
答案 1 :(得分:0)
好的,正如@volpav写的那样,不建议使用正则表达式的这种用法......但是我已经创建了一个符合你的一些期望的正则表达式。然而,这是我刚刚拉到一起的东西,我非常非常有信心,这里有很多人可以编写无法匹配的代码。我只能给你一个起点,然后你必须从那里弄明白。 (例如,这将与没有任何访问修饰符的函数匹配,您必须对其进行排序)
无论如何这是我的建议:
\s*(static)?\s*(public|private)\s*\w+\s*(\w+)\s*(\(\s*\w*(,?\s*\w+)*\))?
但是,我真的建议您使用页面:http://gskinner.com/RegExr/来帮助您使用正则表达式!
祝你好运
答案 2 :(得分:0)
实际上,有时您可能需要在编译时从源代码中提取信息(因此反射结束),并且您可能无法使用Roslyn。特别是,当您需要T4模板中的信息来生成将与源代码一起编译的代码时。
我为VB.NET编写了以下内容(尚未测试),以便将类名和属性名称及类型提取到命名捕获组中:
Static regexClassName As New Regex("(?<=^[^']*\bclass\s)(?<class>\b\w*)", RegexOptions.Compiled Or RegexOptions.CultureInvariant Or RegexOptions.IgnoreCase Or RegexOptions.Multiline)
Static regexProperty As New Regex("(?<=^[^']*\bproperty\s)(?<property>\b\w*)\s[Aa]s\s(?<type>\b\w*)", RegexOptions.Compiled Or RegexOptions.CultureInvariant Or RegexOptions.IgnoreCase Or RegexOptions.Multiline)
这些正则表达式不应与已注释掉的代码匹配。
C#等价物应该与(?<=^[^/]*\bclass\s)(?<class>\b\w*)
类似,以获得类名。