【问题标题】:regular expression to match C structure正则表达式匹配 C 结构
【发布时间】:2016-12-28 00:34:39
【问题描述】:

我想要一个正则表达式来匹配 C 结构定义。这是我的目标数据:

typedef struct
{
}dontMatchThis;

typedef struct
{
  union //lets have a union as well
  {
    struct 
    {
     int a
     //a comment for fun

     int b;
     int c;
    };
    char byte[10];
  };
}structA;

我只想匹配 structA 的定义,从 typedef 到 strunctA。

我试过了: typedef[\s\S]+?structA

但事件虽然我使用的是非贪婪修饰符,但它匹配两种结构。 任何建议

【问题讨论】:

  • 我相当肯定 C/C++ 语法不是正则语言,因此正则表达式可能不是解析它的合适工具...
  • 如果 OP 正在寻找特定模式(例如,this 特定示例),则正则表达式应该能够找到它。毕竟,如果一个人用这些字符创建一个正则表达式,它正在寻找字符串标识,而正则表达式就可以了。问题是你能概括多少(“模式化”),以及 OP 实际需要什么模式?如果 OP 想要匹配看起来 类似 但包含其他嵌套子结构的结构,则正则表达式无法完成这项工作。

标签: python c regex


【解决方案1】:

在一般情况下,这是不可能的。 typedefstruct 可能是由预处理器宏调用生成的(您可以在一个文件中拥有 typedef,在另一个文件中拥有 struct #include-d ,或者来自一个预处理器的 struct宏,以及来自另一个宏的typedef。)。

我建议改为扩展或自定义 GCC 编译器,通过插件或 MELT 扩展(MELT 是扩展 GCC 的特定领域语言)。

另见etags

【讨论】:

    【解决方案2】:

    问题是正则表达式开始匹配的点。它正确地从第一个 typedef 开始匹配并一直持续到 structA。

    你想要做的事情真的很难(我会说不可能正确地做)。您需要匹配嵌套的大括号以查看结构停止的位置。

    Building a Regex Based Parser

    【讨论】:

      【解决方案3】:

      我发现以下作品适合我:

      ([\s\S])<em>(typedef([\s\S])</em>?structA)

      然后我选择第二组,其中包含我的结构。这使用第一个 [\s\S] 作为贪婪运算符来匹配目标结构之前的所有定义。

      【讨论】:

        【解决方案4】:

        正如 ctn 所述 正则表达式中所述非贪婪修饰符的问题在于它开始寻找typedef 的第一个定义,并将在找到structA 的第一个位置停止。介于两者之间的所有内容都被视为有效。使用正则表达式解决您的问题的一种方法是定义一个识别结构的正则表达式,然后在一个单独的阶段验证匹配是否对应于您想要的结构。

        例如,使用正则表达式:

        (typedef[\s\S]+?})\s*([a-zA-Z0-9_]+)\s*;
        

        您将定义 2 个组,其中第一个组以 typedef 开始,以大括号结束,并具有非贪婪文本匹配。第一组包含您可能需要的字符串。最后的花括号后面是结构名称([a-zA-Z0-9_]+),并以; 结尾。考虑到您的示例,将有 2 个匹配项,每个匹配项包含 2 个组。

        第 1 场比赛:

        (typedef struct
        {
        })(dontMatchThis);
        

        第 2 组的值:dontMatchThis

        第 2 场比赛:

        (typedef struct
        {
          union //lets have a union as well
          {
            struct 
            {
             int a
             //a comment for fun
        
             int b;
             int c;
            };
            char byte[10];
          };
        })(structA);
        

        第 2 组的值:structA

        因此,验证组 2 的值是否对应于 structA。

        【讨论】:

          猜你喜欢
          • 2023-04-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-10
          • 1970-01-01
          相关资源
          最近更新 更多