1

我需要在 C++ 代码库中的所有目录中搜索包含位字段的结构。我知道这可以通过正则表达式来完成,但一直无法组合正确的表达式来完成此操作。基本上我需要找到任何出现的 struct*{ : } 其中“*”是任何字符。在此先感谢您的任何建议。

4

1 回答 1

1

(我忽略了您需要多行匹配的事实;如何做到这一点与平台和正则表达式实现不同(看看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;
}

将匹配,这不是您想要的(请注意 main 函数主体中的冒号。因此,您应该寻找在struct左大括号和左大括号之间仅具有有效内容的匹配项。尝试,例如:

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

在普通英语中,它会翻译为:“搜索单词struct,后跟一个或多个空格,后跟仅由给定字符(其中一个或多个)组成的有效标识符名称,可选地后跟任意数量的空格,后跟一个大括号(我们现在在 struct 的定义中),然后是除大括号外的任何文本(我们不想离开定义),在某处有一个冒号,然后是除右大括号外的任何文本,后跟右大括号。

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

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

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

于 2013-05-06T14:29:29.037 回答