0

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

假设我的 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

4 回答 4

2

如果您知道您正在解析的代码是有效的,您可以使用:

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);

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

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

于 2013-11-08T12:08:44.553 回答
1

考虑以下正则表达式...

.*?\sclass\s[\S\s]*?(?={)
于 2013-11-08T19:35:40.257 回答
1

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

  1. 例如静态的、密封的或抽象的和私有的、内部的或公共的可能存在也可能不存在并且可以以任何顺序存在的事实。
  2. 您可能会在代码中错误地找到 @class 变量。
  3. 您尝试匹配的模式可能分布在多行中。

编写这样的正则表达式可能是可能的,但如果可以的话,它会非常复杂和不可靠。您试图在非常规语法中查找内容,因此正则表达式不是解决方案。你需要一个合适的语法分析器。

于 2013-11-08T09:37:46.513 回答
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. 寻找课程

为了使代码正常运行,您应该:

  1. 将其复制粘贴到字符串中(糟糕,但有效):在这种情况下,您应该将所有内容"替换为\"
  2. 从字符串中的文件加载:引号应自动处理,但请注意
于 2013-11-08T12:25:00.850 回答