Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过正则表达式获取类名为的方法名_C#_Regex_Pattern Matching - Fatal编程技术网

C# 通过正则表达式获取类名为的方法名

C# 通过正则表达式获取类名为的方法名,c#,regex,pattern-matching,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)

我有一个.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;
        }
    }
}
现在我需要一个正则表达式,它返回每个方法名、属性名和全局变量及其关联的类名和命名空间

有人能告诉我任何可能的解决办法或想法吗


提前感谢

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


如果你是在.NET4.5下开发的,我会使用-它是这类工作的完美工具,而且相对容易开始。另一种方法是用它编写一个简单的聚集类结构。

好的,就像@volpav编写的那样,不建议使用这种regex。。。但是我创建了一个正则表达式,它符合您的一些期望。然而,这是我刚刚匆忙完成的工作,我非常有信心,这里有很多人可以编写无法匹配的代码。我只能给你一个起点,然后你就必须从那里找到答案。(例如,这将不匹配没有任何访问修饰符的函数,您必须对其进行排序)

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

\s*(静态)?\s*(公共的)\s*\w+\s*(\w+)\s*(\(\s*\w*(,?\s*\w+)*\)?

然而,我真的可以推荐你使用这个页面:帮助你使用正则表达式


祝你好运

事实上,有时你需要在编译前从源代码中提取信息(因此反射已经消失),而你可能无法使用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)

Static regexportssname作为新的Regex((?@Sayse-no,我想他的意思是他从.cs文件读取,因此它是一个文本数据。而不是重写半个编译器(或至少是解析器)为什么不编译它并在结果上使用呢?我不想使用反射,我想通过正则表达式来实现。正则表达式方法的另一个缺点是:你可以判断你的类是否继承自另一个特定的类,但要判断你的类是否继承自某个特定的类并不容易。这就是为什么我想要去看Roslyn 1.0。