正则表达式查找使用位字段定义的所有结构

时间:2013-04-15 17:57:42

标签: c++ regex bit-fields

我需要在C ++代码库中搜索包含位字段的结构的所有目录。我知道这可以通过正则表达式完成,但是无法将正确的表达式组合在一起来完成此任务。基本上我需要找到任何struct * {},其中" *"是任何角色。提前感谢任何建议。

1 个答案:

答案 0 :(得分:0)

(我忽略了你需要多行匹配的事实;如何做到这一点与平台和正则表达式实现不同(看看sed!)。

.*字后面的struct与任何内容匹配,包括{和}。因此,字符串struct s_one {bool a:3;} one; struct s_two {bool b:4} two;只是一个匹配。更差,     struct one {       int noBits;     };

int main(void)
{
  return (2>1)?1:0;
}

会匹配,这不是你想要的(注意主函数体内的冒号。所以你应该找一个只有struct和左括号之间有效的匹配。试试,例如:

struct\s+[a-zA-Z0-9_]+\s*{ [^}]*:[^}]*}

,在普通英语中,将翻译为:“搜索单词struct,后跟一个或多个空格,后跟有效标识符名称,仅包含给定字符(其中一个或多个) ,可选地后跟任意数量的空格,然后是一个卷曲的开括号(我们现在在struct 的定义内),后跟任何文本,除了一个曲线的右括号(我们不想留下定义),在某个地方有一个冒号,然后是除了卷曲的右括号之外的任何文本,然后是右括号。

请注意,根据您的解析器,您可能需要转义花括号(它们在Regex中有一个特殊的meainig)。还要注意,一个更简单的正则表达式也可能就足够了(例如,你可以删除冒号后面的任何内容,它仍然可以工作),但是我写下来的内容更好地说明了如何构造这样的正则表达式。另请注意,此正则表达式未考虑代码中的任何形式的注释(例如,它不匹配

struct one // my favorite first struct
{
  bool a:8;
};

(因为one // my favorite first struct与“有效标识符名称”代码[a-zA-Z0-9_]不匹配。)