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