我要提取的枚举如下:
...
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。我不能依靠缩进。
答案 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}";
但是,您可以通过几步就可以捕获枚举。看看这个算法
示例:
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);