在评论中用括号提取枚举?

Extract Enums with brackets in comments?

我要提取的枚举如下:

...
other code 
...
enum A
{
  a,
  b=2,
  c=3,
  d//{x}
}
...
More Enums like the above.
...

首先,我尝试将选项 Singleline 与正则表达式一起使用:
enum\s*\w+\s*{.*?\}

但是,由于评论有 brackets.The 正则表达式不起作用。运行到评论中的括号就会停止

所以我尝试在评论后排除括号。根据我目前搜索到的内容,似乎我需要 Negative look ahead with grouping construct Multiline.

然后我尝试在没有注释的情况下解析括号。
子步骤是在注释后找到括号: (?m:^.*?//.*?}.*?$).

然而,似乎 . 即使在内联多行模式下仍然匹配任何字符,包括换行符。

然后我首先尝试使用多行。由于主要问题是 comments.I 中的括号 tried:
(?!//.*)} 负面展望并不像我预期的那样有效。

这里有一个csharp-regex-test-link供大家测试

总而言之,我需要从 csharp 源代码文件中解析枚举。

我的主要问题是评论中的括号。

编辑: 澄清

评论中的

1.brackets是成对的。例如:

xxx=xxx; //{xx} 

2.comments只有//

的形式

3.I 不能依赖缩进。

您可以使用

@"\benum\s*\w+\s*{(?>[^{}]+|(?<o>){|(?<-o>)})*(?(o)(?!)|)}"

regex demo

详情

  • \benum - 一个完整的单词 enum
  • \s* - 0+ 个空格
  • \w+ - 1+ 个单词字符
  • \s* - 0+ 个空格
  • { - 一个 { 字符
  • (?>[^{}]+|(?<o>){|(?<-o>)})* - 除了 {} 之外的 1+ 个字符,或者带有空字符串的 { 被推入组 o 堆栈,或 } 具有从组 o 堆栈
  • 中弹出的值
  • (?(o)(?!)|) - 一个条件 yes-no 构造,如果组 o 仍有任何项目留在堆栈中,则匹配失败并使正则表达式引擎在当前位置回溯
  • } - 一个 } 字符。

我认为不可能用一个正则表达式来完成你的任务。如果你有一个看起来像

的字符串怎么办
var notEnum = "enum A {a, b, c}";

但是您可以通过几次传递来捕获您的枚举。看看这个算法

  1. 清除字符串内容
  2. 删除单行注释
  3. 删除多行评论
  4. 使用你原来的正则表达式

示例:

var code = ...

var stringLiterals = new Regex("\"[^\"\\]*(?:\\.[^\"\\]*)*\"", RegexOptions.Compiled);
var multilineComments = new Regex("/\*.*?\*/", RegexOptions.Compiled | RegexOptions.Singleline);
var singlelineComments = new Regex("//.*$", RegexOptions.Compiled | RegexOptions.Multiline);
var @enum = new Regex("enum\s*\w+\s*{.*?}", RegexOptions.Compiled | RegexOptions.Singleline);

code = stringLiterals.Replace(code, m => "\"\"");
code = multilineComments.Replace(code, m => "");
code = singlelineComments.Replace(code, m => "");

var enums = @enum.Matches(code).Cast<Match>().ToArray();

foreach (var match in enums)
    Console.WriteLine(match.Value);