2013-05-10 109 views
1

我想要一个正则表达式来匹配C结构定义。这是我的目标数据:正则表达式匹配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

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

+3

我很确定C/C++语法不是常规语言,因此正则表达式可能不是解析它的恰当工具... – twalberg 2013-05-10 16:25:24

+0

如果OP正在寻找特定模式(例如,* this *具体的例子),正则表达式应该能够找到它。毕竟,如果一个正则表达式使用正则表达式,它正在寻找字符串标识,而正则表达式就可以做到这一点。问题是你可以概括多少(“模式化”),以及OP实际需要哪些模式?如果OP想要匹配看起来像*这样的结构,但包含其他嵌套子结构,则正则表达式无法完成这项工作。 – 2013-05-10 16:49:30

回答

1

在一般情况下,这根本是不可能的。该typedefstruct可能是由预处理宏调用生成的(你可以有一个文件typedef,并struct在另一个#include -d文件,或struct从一个预处理宏,并从另一个typedef到来。)。

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

etags

1

看到的问题是,其中的regexp开始相匹配的点。它正确地在第一个typedef处开始匹配,并持续到structA。

真的很难(我认为不可能做到正确)你想做什么。您需要匹配嵌套大括号来查看结构停止的位置。

请参阅Building a Regex Based Parser

0

我发现了以下工作对我来说:

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

然后我选择了第二组,其中有我的结构,它使用了第一个[\ S \ S]作为一个贪婪的经营者相匹配。目标结构之前的所有定义。

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。