在评论中用括号提取枚举?
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)(?!)|)}"
详情
\benum
- 一个完整的单词 enum
\s*
- 0+ 个空格
\w+
- 1+ 个单词字符
\s*
- 0+ 个空格
{
- 一个 {
字符
(?>[^{}]+|(?<o>){|(?<-o>)})*
- 除了 {
和 }
之外的 1+ 个字符,或者带有空字符串的 {
被推入组 o
堆栈,或 }
具有从组 o
堆栈 中弹出的值
(?(o)(?!)|)
- 一个条件 yes-no
构造,如果组 o
仍有任何项目留在堆栈中,则匹配失败并使正则表达式引擎在当前位置回溯
}
- 一个 }
字符。
我认为不可能用一个正则表达式来完成你的任务。如果你有一个看起来像
的字符串怎么办
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);
我要提取的枚举如下:
...
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)(?!)|)}"
详情
\benum
- 一个完整的单词enum
\s*
- 0+ 个空格\w+
- 1+ 个单词字符\s*
- 0+ 个空格{
- 一个{
字符(?>[^{}]+|(?<o>){|(?<-o>)})*
- 除了{
和}
之外的 1+ 个字符,或者带有空字符串的{
被推入组o
堆栈,或}
具有从组o
堆栈 中弹出的值
(?(o)(?!)|)
- 一个条件yes-no
构造,如果组o
仍有任何项目留在堆栈中,则匹配失败并使正则表达式引擎在当前位置回溯}
- 一个}
字符。
我认为不可能用一个正则表达式来完成你的任务。如果你有一个看起来像
的字符串怎么办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);