我想要一个正则表达式来匹配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
但事件虽然我使用的是非贪婪的修饰符,但它匹配两种结构。 任何建议
答案 0 :(得分:1)
在一般情况下,根本不可能。 typedef
或struct
可能是由预处理程序宏调用生成的(您可以在一个文件中typedef
,在另一个struct
中#include
- d文件,或来自一个预处理器宏的struct
,以及来自另一个预处理器宏的typedef
。)。
我建议通过插件或MELT扩展来扩展或自定义GCC编译器(MELT是扩展GCC的域特定语言)。
另见etags
答案 1 :(得分:1)
问题是正则表达式开始匹配的问题。它正确地开始匹配第一个typedef并继续直到structA。
你要做的事情真的很难(我会说不可能做到正确)。您需要匹配嵌套大括号以查看结构停止的位置。
答案 2 :(得分:0)
我发现以下内容适用于我:
([\s\S])(typedef([\s\S])?structA)
然后我选择第二个组,它具有我的结构。这使用第一个[\ s \ S]作为贪婪的运算符来匹配目标结构之前的所有定义。
答案 3 :(得分:0)
正如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的问题。