首页 > 解决方案 > 在评论中提取带括号的枚举?

问题描述

我要提取的枚举如下:

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

首先,我尝试使用Singleline带有正则表达式的选项:
enum\s*\w+\s*{.*?\}

但是,由于注释有括号。正则表达式不起作用。当它运行到评论中的括号时它将停止。

所以我尝试在评论后排除括号。根据我到目前为止搜索的内容,似乎我需要对分组构造进行负面展望Multiline

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

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

然后我首先尝试使用多行。由于主要问题是评论中的括号。我尝试过:
(?!//.*)} 负面展望没有按我预期的方式工作。

这是一个csharp-regex-test-link供您测试。

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

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

编辑:澄清

1.评论中的括号是成对的。例如:

xxx=xxx; //{xx} 

2.comments 的形式只有//

3.我不能依赖缩进。

标签: c#regexnegative-lookahead

解决方案


您可以使用

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

查看正则表达式演示

细节

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

推荐阅读