提取枚举中带括号的枚举?

时间:2019-01-23 10:48:05

标签: c# regex negative-lookahead

我要提取的枚举如下:

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

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

但是,由于注释带有方括号,因此正则表达式不起作用。当它到达注释中的括号时,它将停止。

所以我尝试在评论后排除括号。根据到目前为止的搜索,似乎我需要对结构Multiline进行分组前的否定检查。

然后我尝试解析方括号,但不加注释。
子步骤是在注释后找到括号: (?m:^.*?//.*?}.*?$)

但是,即使在串联多行模式下,看来.仍与包括换行符在内的anychar匹配。

然后我首先尝试使用多行。由于主要问题是注释中的括号。我尝试过:
(?!//.*)} 负面的展望并不符合我的预期。

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

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

我的主要问题是注释中的括号。

修改: 要澄清

1。注释中的括号成对出现。例如:

xxx=xxx; //{xx} 

2.comments仅采用//

的形式

3。我不能依靠缩进。

2 个答案:

答案 0 :(得分:3)

您可以使用

@"\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上还有剩余项目,则匹配失败,并使正则表达式引擎在当前位置回退
  • }-一个}字符。

答案 1 :(得分:1)

我认为仅用一个正则表达式就不可能完成您的任务。如果您的字符串看起来像

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