0

我有一个 .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;
        }
    }
}

现在我想要一个正则表达式,它返回每个方法名、属性名和全局变量及其关联的类名和命名空间。

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

提前致谢

4

3 回答 3

0

好的,正如@volpav 所写,不建议使用这种正则表达式......但我创建了一个符合您的一些期望的正则表达式。然而这是我匆忙拼凑起来的东西,我非常有信心这里有很多人可以编写无法匹配的代码。我只能给你一个起点,然后你必须从那里弄清楚。(例如,这将不匹配没有任何访问修饰符的函数,您必须对其进行整理)

无论如何,这是我的建议:

\s*(static)?\s*(public|private)\s*\w+\s*(\w+)\s*(\(\s*\w*(,?\s*\w+)*\))?

但是,我真的可以推荐您使用以下页面: http: //gskinner.com/RegExr/来帮助您使用正则表达式!

祝你好运

于 2013-03-14T09:53:00.840 回答
0

不要使用正则表达式进行这种分析。您将无法构建一个健壮的解析器(例如,返回具有完全限定类型名称的结果的方法、返回泛型类型的泛型方法等。当然,这一切都取决于您的任务的具体情况)。

如果您在 .NET 4.5 下进行开发,我会使用Roslyn - 它是完成此类工作的完美工具,而且相对容易上手。另一种方法是编写一个简单的标记器并用它收集类结构。

于 2013-03-14T08:54:10.710 回答
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*)获取类名称。

于 2013-04-25T16:34:09.360 回答