如何从.cs文件获取类名,其他信息由Regex提供

时间:2013-11-08 09:28:10

标签: c# regex

我是正则表达式的新手。我需要编写一个正则表达式代码,它使用它的说明符,类型(抽象,静态)及其基类来查找所有类。

如果我的Customer.cs文件有以下代码

,请说明
 internal class Customer
{
 //stuff
}
public class XYZ : Customer
    ,IServiceProvider
{
    private class Order
    {
 //stuff
    }
}

public abstract class ABC
{ 
     //stuff
}
public static class ABC1
{ 
     //stuff
}

如何通过Regexp

获取以下格式的所有类名
internal class Customer
 public class XYZ : Customer
        ,IServiceProvider
private class Order
public abstract class ABC
public static class ABC1

我不能为此目的使用反射。

提前致谢

4 个答案:

答案 0 :(得分:1)

你的正则表达式需要处理:

  1. 事实上,例如静态,密封或抽象,私人,内部或公共可能存在或不存在,并且可以按任何顺序排列。
  2. 您可能会错误地在代码中找到@class变量。
  3. 您尝试匹配的模式可能分布在多行上。
  4. 有可能写出这样的正则表达式,但如果可以的话,这将是非常复杂和不可靠的。您试图在非常规语法中查找内容,因此正则表达式不是解决方案。你需要一个合适的语法分析器。

答案 1 :(得分:1)

如果您知道要解析的代码有效,则可以使用:

const string Code = @"internal class Customer..."; //code to parse goes here

const string pattern = @"(((internal)|(public)|(private)|(protected)|(sealed)|(abstract)|(static))?[\s\r\n\t]+){0,2}class[\s\S]+?(?={)";

var matches = System.Text.RegularExpressions.Regex.Matches(Code, pattern, RegexOptions.Multiline | RegexOptions.IgnoreCase);

var classes = matches.Cast<Match>().Select(x => x.Value.Trim());

您可能希望对结果进行一些清理 - 即删除新行

答案 2 :(得分:1)

考虑以下Regex ......

.*?\sclass\s[\S\s]*?(?={)

答案 3 :(得分:0)

假设代码是正确的(即它编译没有问题)你不需要正则表达式,拆分就可以完成工作:

var code = "<Your code goes in here"; // SEE BELOW
var classDeclarations = code
     .Replace(Environment.NewLine, "")
     .Split('{', '}')
     .Where(c => c.Contains("class");

代码的作用:

  1. 删除所有换行的新内容
  2. 分裂大括号
  3. 追捕课程
  4. 要使代码正常运行,您应该:

    1. 复制 - 将其粘贴到字符串中(糟糕但有效):在这种情况下,您应该将所有"替换为\"
    2. 从文件中加载字符串:引号应自动处理,但要注意它