使用C#从HeaderFile中提取宏

时间:2017-08-01 12:52:19

标签: c# regex macros

我正在尝试使用正则表达式提取宏名称及其背后的代码,并希望将它们保存在一起!我要扫描的头文件看起来像这样:

#define TEST_MAKRO (ival)    \
{                            \
   somevalue = ival;         \
}
#define TEST_MAKRO2 (ival1, ival2, retval)    \
{                            \
   retval = ival1 + ival2;   \      
}
#define TEST_MASK 0x123 \

现在我试图匹配#define(没有param)和整个#define until}这样:

string makroexp1 = @"(#define+(\s)+[^()]*)";
string makroexp2 = @"define+(.*\\\n)+(\})";

string[] lines = File.ReadAllLines(path);
string temporarystring = "";
foreach (string line in lines)
{
   temporarystring += line;
   temporarystring += "\n";
}
foreach (Match makroname in Regex.Matches(temporarystring, makroexp1)){
   //somehow add to dictonary (this should be the key)
}
foreach (Match replacement in Regex.Matches(temporarystring, makroexp2)){
   //add to dictionary (this should be the value of the corresponding key)
}

它实际上有点工作(匹配),但我找不到将它们组合在一起的好方法......类似于:

makrodic.Add(makroname.Value, replacement.Value) 

不能工作obv:/

  • 任何人都有什么好主意吗?

3 个答案:

答案 0 :(得分:1)

使用

@"#define\s+(\w+).*\\(?:\s*{((?:.*\\\s+)*)})?"

请参阅regex demo

然后,match.Groups[1].Value是名称(TEST_MAKRO),match.Groups[2].Value是内容。

<强>详情:

  • #define - 文字子字符串
  • \s+ - 一个或多个空格
  • (\w+) - 第1组匹配一个或多个字词
  • .*\\ - 除了换行符之外的任何0 +字符,直到最后一行\后面跟着...
  • (?:\s*{((?:.*\\\s+)*)})? - 一个可选的非捕获组,匹配以下序列:
    • \s* - 0+ whitespaces
    • { - {
    • ((?:.*\\\s+)*) - 第2组:0+序列:
      • .* - 尽可能多的换行以外的任何0 +字符
      • \\ - \符号
      • \s+ - 1+空格
    • } - }

enter image description here

答案 1 :(得分:0)

也许这给你一个很好的起点(需要调整单行宏):

        var macros = new Dictionary<string, string>();
        var regex = new Regex(@"#define +(\w+).*\n\{([^\{\}]+)\}");

        foreach (Match m in regex.Matches(File.ReadAllText(path)))
        {
            macros[m.Groups[1].ToString()] = m.Groups[2].ToString();
        }

答案 2 :(得分:0)

感谢帮助人员,我的最终解决方案看起来像这样! (感谢@WiktorStribiżew)

string makroexp = @"#define\s+(\w+).*\\(?:\s*{((?:.*\\\s+)*)})?";

string[] lines = File.ReadAllLines(Path.GetFullPath(....));
string temporarystring = "";

string[] keys = new string[0];
string[] values = new string[0];

foreach (string line in lines)
{
    temporarystring += line;
    temporarystring += "\n";
}


try
{
    makrodic.Add(makro.Groups[1].Value, makro.Groups[2].Value);
}
catch
{
    //Already added
}