1

我想要一个正则表达式来匹配 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

但是事件虽然我使用的是非贪婪修饰符,但它与两种结构都匹配。有什么建议么

4

4 回答 4

1

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

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

另请参阅

于 2013-05-10T15:24:41.497 回答
1

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

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

请参阅构建基于正则表达式的解析器

于 2013-05-10T15:25:39.300 回答
0

我发现以下对我有用:

([\s\S])(typedef([\s\S])?structA)

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

于 2013-05-13T07:43:25.110 回答
0

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

例如,使用正则表达式:

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

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

第一场比赛:

(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 成为问题。

于 2016-12-27T16:34:39.993 回答