Perl正则表达式在不使用可变长度lookbehind的情况下找到压缩结构的名称?

时间:2015-11-04 19:35:03

标签: c regex perl

我有几个不同文件的C结构。其中一些被指定为打包,有些则不是。像这样:

pscp name@example.com:/home/www/file c:\xampp\htdocs

我想获得仅包装结构的结构名称列表。对于上面的代码,其中包括typedef struct foo_s { uint32 foo_field_1; uint64 foo_field_2; } foo_t; typedef struct bar_s { uint32 bar_field_1; uint64 bar_field_2; } __packed bar_t; ,但不包括bar_s

我写了一个像这样的Perl单行程,似乎让我大部分都在那里:

foo_s

问题在于,对于上面的结构,这实际上返回foo_s,因为它最初匹配perl -0777 -ne 'while(m/typedef struct (\w+) {\n(?:.*\n)*?} __packed \w+;/g){print "$1\n";}' <filename> ,然后继续直到匹配typedef struct foo_s {

我尝试使用lookbehind返回并找到} __packed bar_t的最新匹配,只要找到typedef struct,但不支持可变长度的lookbehind。

有没有办法用Perl中的正则表达式处理这个问题?理想情况下,每次找到它时都会匹配__packed,然后如果找到typedef struct <name>,则打印出最近匹配的结构名称&#34;。< / p>

如果可以,我想避免编写解析器。

谢谢!

1 个答案:

答案 0 :(得分:4)

$ perl -0777 -nE 'say $1 while m/typedef struct (\w+) \{[^}]+\} __packed \w+;/g' file
bar_s

此处的密钥为\{[^}]+\},以匹配没有“内部”关闭括号的支撑块。