c#regex - 从类文件(.cs)中选择类属性名称,方法名称和字段

时间:2012-08-11 11:53:35

标签: c# regex properties methods match

我想匹配(从类文件中选择)methodsname,属性名称和字段名称。

这是示例类:

class Perl
{
    string _name;
    public string Name { get; set; }
    public Perl()
    {
    // Assign this._name
    this._name = "Perl";
    // Assign _name
    _name = "Sam";

    // The two forms reference the same field.
    Console.WriteLine(this._name);
    Console.WriteLine(_name);
    }
    public static string doSomething(string test)
    {
        bla test;
    }
}

我得到了方法的代码:

(?:public|private|protected)([\s\w]*)\s+(\w+)\s*\(\s*(?:\w+\s+(\w+)\s*,?\s*)+\)

我有疑问:

  • 以上正则表达式代码获取所有方法,但它的工作原理相当不错 我也希望它选择方法名称,但没有参数和 存取。所以从exaplmce类使用我的代码结果将是: 公开Perl()公共静态doSomething(字符串测试)但我想要这样的结果: Perl() doSomething( )即可。所以 - 我的代码匹配良好,但我希望结果像我一样显示 在上一句中写道。
  • 如何选择属性?显示结果:类型和属性 名称。因此,从exaple类结果将是: string Name
  • 如何选择带有结果的字段:type field_name。在它的情况下它 将是: string _name

4 个答案:

答案 0 :(得分:3)

使用此Regex

方法

(?:public\s|private\s|protected\s|internal\s)?[\s\w]*\s+(?<methodName>\w+)\s*\(\s*(?:(ref\s|/in\s|out\s)?\s*(?<parameterType>\w+)\s+(?<parameter>\w+)\s*,?\s*)+\)

并获取名为methodNameparameterType以及parameter的小组。

和字段:

(?:public\s|private\s|protected\s)\s*(?:readonly\s+)?(?<type>\w+)\s+(?<name>\w+)

并获取名为typename的小组。

例如,您的方法代码可以是这样的:

var inputString0 = "public void test(string name, out int value)\r\nvoid test(string name, int value)";
foreach (Match match in Regex.Matches(inputString0, @"(?:public\s|private\s|protected\s)?[\s\w]*\s+(?<methodName>\w+)\s*\(\s*(?:(ref\s|/in\s|out\s)?\s*(?<parameterType>[\w\?\[\]]+)\s+(?<parameter>\w+)\s*,?\s*)+\)"))
{
    var methodName = match.Groups["methodName"].Value;
    var typeParameterPair = new Dictionary<string, string>();
    int i = 0;
    foreach (var capture in match.Groups["parameterType"].Captures)
    {
        typeParameterPair.Add(match.Groups["parameterType"].Captures[i].Value, match.Groups["parameter"].Captures[i].Value);
        i++;
    }
}

您也可以使用 codeplex 中的Irony - .NET Language Implementation Kit

答案 1 :(得分:2)

正如您对答案的评论中所述,更可靠的方法是编译您的.cs文件,然后使用反射来询问您感兴趣的成员的类型。它将涉及以下内容:

  1. 使用C#编译器(csc.exe)编译文件。 MSDN包含有用的examples and hints。您可以手动执行此操作,或者,如果要自动完成整个操作,可以使用Process class以编程方式执行csc.exe。
  2. 使用Assembly.LoadFile()方法加载生成的程序集。
  3. 您现在可以使用装配中的get types反射和interrogate它们。
  4. 编辑:作为csc.exe的替代方案,您可以使用CodeDOM - 其中包含example,其中包含您需要的所有内容。

答案 2 :(得分:0)

诸如C#之类的语言在语句语法中接受太多变化,只能使用正则表达式进行解析。在正则表达式之上,您需要一个上下文语法分析器。

我会尝试Roslyn:它是一个C#编译器,其内部可以从您的代码中访问。让Roslyn解析代码并查询它所需的任何信息。

答案 3 :(得分:0)

我建议查看Microsoft.VisualStudio.CSharp.Services.Language命名空间和其他 Visual Studio可扩展性功能。这将消除编译的需要。