使用正则表达式提取struct结构及内容
时间:2010-11-26 来源:xuxiyao8888
使用正则表达式提取struct结构及内容
内容简介:演示如何在.Net环境下使用正则表达式将C代码头文件中struct结构及内容提取出来。 使用工具:RegexTester V1.1.1,Developed by IT民工。 下载地址:右键点击另存为 RegexTester是我使用VB.Net开发的正则表达式工具。关于它的使用,我会在另一篇文章中讲解。 测试平台:.Net Framework 1.0 任务描述:C语言头文件header.h,里面使用typedef struct格式定义了若干的结构。 现在需要将每个结构提取出来,并提取出每个结构里面的每一个成员变量。 任务意义:完成这些提取,可以方便其他跨语言的工作。 如将其存储为XML格式,或直接存入数据库,也可以从数据库中读取结构,构造树状视图等等。 关键字: Regular Expression .Net typedef struct
文件header.h内容如下: /*这只是一个例子,目的是演示 如何使用正则表达式将C代码头文件中struct结构及内容提取出来*/ typedef struct st_Shit1 { u8 a; //u8 = unsigned char u16 b; //u16 = unsigned short }t_Shit1;
/*这些注释都将被删除掉*/ typedef struct st_Shit2 { u8 c; PACK_U8 //宏,u8的填充byte t_Shit1 a_Shit1[16]; //数组 }t_Shit2;
说明:u8是预定义的宏,代表unsigned char,u16也是预定义的宏,代表unsigned short。PACK_U8也是宏,展开后是一个Byte的填充。
步骤如下: 1、删除/* ... */的多行注释 2、删除//的单行注释 3、从无注释代码中分解出每一个struct的名称和内容 4、从每一个struct的内容中分解出每个成员变量的名称和类型
详述如下: 1、删除/* ... */的多行注释 匹配式为:/\*.*?\*/ 替换式为:(空) 正则选项:SingleLine 替换之后结果为:
typedef struct st_Shit1 { u8 a; //u8 = unsigned char u16 b; //u16 = unsigned short }t_Shit1;
typedef struct st_Shit2 { u8 c; PACK_U8 //宏,u8的填充byte t_Shit1 a_Shit1[16]; //数组 }t_Shit2;
可以看到/* ... */的注释被删除了。
2、删除//的单行注释 匹配式为://[^\r\n]* 替换式为:(空) 正则选项:默认 替换之后结果为:
typedef struct st_Shit1 { u8 a; u16 b; }t_Shit1;
typedef struct st_Shit2 { u8 c; PACK_U8 t_Shit1 a_Shit1[16]; }t_Shit2;
可以看到//...的注释被删除了。
3、从无注释代码中分解出每一个struct的名称和内容 匹配式为:typedef\s+struct\s+(?\w+)\s*\{\s*(?[\w\;\s\[\]\{\}]+?)\s*}(?\w+)\s*\; 替换式为:Type = ${st_},Name = ${st_},Content = ${content} 正则选项:默认 替换之后结果为:
Type = st_Shit1,Name = st_Shit1,Content = u8 a; u16 b;
Type = st_Shit2,Name = st_Shit2,Content = u8 c; PACK_U8 t_Shit1 a_Shit1[16];
可以看到struct的名称和内容都被分解出来了。
4、从每一个struct的内容中分解出每个成员变量的名称和类型 匹配式为:\s*(?\w+)\s*((?\w+)\s*(\[(?\w+)\s*\])?\s*\;)? 替换式为:Type:${Type}, Name:${Name}, Len:${Length} 正则选项:默认
对第1个struct的内容进行处理,输入: u8 a; u16 b; 替换之后结果为: Type:u8, Name:a, Len: Type:u16, Name:b, Len:
对第2个struct的内容进行处理,输入: u8 c; PACK_U8 t_Shit1 a_Shit1[16]; 替换之后结果为: Type:u8, Name:c, Len: Type:PACK_U8, Name:, Len: Type:t_Shit1, Name:a_Shit1, Len:16
可以看到struct内的成员变量的名称和类型,甚至数组的容量都被分解出来了。
注意事项: 1、这里举例使用的struct都是使用typedef struct定义的格式,如果是其他格式,就需要手工修改匹配的表达式了。 也许会累一些,因为需要不断的测试。但是和其他麻烦的方法相比,正则表达式还是轻松多了:) 2、这里使用的是VB.Net的语法,其他的语言,构造基本相同,可能会有细节部分需要自行修改。 3、关于RegexTester这个工具,是我自己为了辅助工作需要而开发的,当然,网上也有不少类似的NB工具,可以自己搜索下载使用。 4、分解出来这些内容干什么用?当然不仅仅是为了好玩!我需要把它的结构保存起来......具体使用XML还是数据库还正在伤脑筋之中。 好像XPATH 2.0的规范里面能够使用类似于SQL的语句,还不是很清楚,也许是个不错的选择......但是我还是倾向于使用数据库。 5、不熟悉正则表达式的同学,还是好好学习一下正则表示式吧,上面的那些式子中,用到了"非贪婪匹配","分组匹配"等知识......呵呵,其实都挺土的......
内容简介:演示如何在.Net环境下使用正则表达式将C代码头文件中struct结构及内容提取出来。 使用工具:RegexTester V1.1.1,Developed by IT民工。 下载地址:右键点击另存为 RegexTester是我使用VB.Net开发的正则表达式工具。关于它的使用,我会在另一篇文章中讲解。 测试平台:.Net Framework 1.0 任务描述:C语言头文件header.h,里面使用typedef struct格式定义了若干的结构。 现在需要将每个结构提取出来,并提取出每个结构里面的每一个成员变量。 任务意义:完成这些提取,可以方便其他跨语言的工作。 如将其存储为XML格式,或直接存入数据库,也可以从数据库中读取结构,构造树状视图等等。 关键字: Regular Expression .Net typedef struct
文件header.h内容如下: /*这只是一个例子,目的是演示 如何使用正则表达式将C代码头文件中struct结构及内容提取出来*/ typedef struct st_Shit1 { u8 a; //u8 = unsigned char u16 b; //u16 = unsigned short }t_Shit1;
/*这些注释都将被删除掉*/ typedef struct st_Shit2 { u8 c; PACK_U8 //宏,u8的填充byte t_Shit1 a_Shit1[16]; //数组 }t_Shit2;
说明:u8是预定义的宏,代表unsigned char,u16也是预定义的宏,代表unsigned short。PACK_U8也是宏,展开后是一个Byte的填充。
步骤如下: 1、删除/* ... */的多行注释 2、删除//的单行注释 3、从无注释代码中分解出每一个struct的名称和内容 4、从每一个struct的内容中分解出每个成员变量的名称和类型
详述如下: 1、删除/* ... */的多行注释 匹配式为:/\*.*?\*/ 替换式为:(空) 正则选项:SingleLine 替换之后结果为:
typedef struct st_Shit1 { u8 a; //u8 = unsigned char u16 b; //u16 = unsigned short }t_Shit1;
typedef struct st_Shit2 { u8 c; PACK_U8 //宏,u8的填充byte t_Shit1 a_Shit1[16]; //数组 }t_Shit2;
可以看到/* ... */的注释被删除了。
2、删除//的单行注释 匹配式为://[^\r\n]* 替换式为:(空) 正则选项:默认 替换之后结果为:
typedef struct st_Shit1 { u8 a; u16 b; }t_Shit1;
typedef struct st_Shit2 { u8 c; PACK_U8 t_Shit1 a_Shit1[16]; }t_Shit2;
可以看到//...的注释被删除了。
3、从无注释代码中分解出每一个struct的名称和内容 匹配式为:typedef\s+struct\s+(?\w+)\s*\{\s*(?[\w\;\s\[\]\{\}]+?)\s*}(?\w+)\s*\; 替换式为:Type = ${st_},Name = ${st_},Content = ${content} 正则选项:默认 替换之后结果为:
Type = st_Shit1,Name = st_Shit1,Content = u8 a; u16 b;
Type = st_Shit2,Name = st_Shit2,Content = u8 c; PACK_U8 t_Shit1 a_Shit1[16];
可以看到struct的名称和内容都被分解出来了。
4、从每一个struct的内容中分解出每个成员变量的名称和类型 匹配式为:\s*(?\w+)\s*((?\w+)\s*(\[(?\w+)\s*\])?\s*\;)? 替换式为:Type:${Type}, Name:${Name}, Len:${Length} 正则选项:默认
对第1个struct的内容进行处理,输入: u8 a; u16 b; 替换之后结果为: Type:u8, Name:a, Len: Type:u16, Name:b, Len:
对第2个struct的内容进行处理,输入: u8 c; PACK_U8 t_Shit1 a_Shit1[16]; 替换之后结果为: Type:u8, Name:c, Len: Type:PACK_U8, Name:, Len: Type:t_Shit1, Name:a_Shit1, Len:16
可以看到struct内的成员变量的名称和类型,甚至数组的容量都被分解出来了。
注意事项: 1、这里举例使用的struct都是使用typedef struct定义的格式,如果是其他格式,就需要手工修改匹配的表达式了。 也许会累一些,因为需要不断的测试。但是和其他麻烦的方法相比,正则表达式还是轻松多了:) 2、这里使用的是VB.Net的语法,其他的语言,构造基本相同,可能会有细节部分需要自行修改。 3、关于RegexTester这个工具,是我自己为了辅助工作需要而开发的,当然,网上也有不少类似的NB工具,可以自己搜索下载使用。 4、分解出来这些内容干什么用?当然不仅仅是为了好玩!我需要把它的结构保存起来......具体使用XML还是数据库还正在伤脑筋之中。 好像XPATH 2.0的规范里面能够使用类似于SQL的语句,还不是很清楚,也许是个不错的选择......但是我还是倾向于使用数据库。 5、不熟悉正则表达式的同学,还是好好学习一下正则表示式吧,上面的那些式子中,用到了"非贪婪匹配","分组匹配"等知识......呵呵,其实都挺土的......
相关阅读 更多 +