通过regex表达式获取带有类名的方法名称

时间:2013-03-14 08:44:34

标签: c# regex pattern-matching

我有一个.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,它返回每个方法名称,属性名称和全局变量及其关联的类名和命名空间。

任何人都可以告诉我任何可能的解决方案或想法。

提前致谢

3 个答案:

答案 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*)类似,以获得类名。