首页 > 解决方案 > 如何使用正则表达式扫描在 .c 文件中定义具有初始大写卡梅尔案例名称的静态变量的代码行?

问题描述

我正在使用正则表达式在代码审查期间自动在代码库中强制执行编码样式。我无法想出正则表达式来扫描 .c 文件中以大写字母开头的静态变量和函数名,因为扫描模式非常复杂和动态,即在“静态”和变量名之间可以是 int 等数据类型,也可以是 const 等关键字。

我目前的解决方案如下所示:

^\s*static\s((const|inline|volatile)\s)?(unsigned\s)?[a-zA-Z0-9_]+\s\*?[A-Z].*$

它适用于许多模式,但当数据类型也以大写字母开头时,它会出现误报。例如,即使“variableName”以小写字母开头,“static volatile Data_type variableName”也是正数。

这里还有一些例子:

   /* positives */
static void ZVar_Able(void)
static void Variable
static const int_64 Variable
static MyDataType_t DefinedVariable =
static const unsigned int INIT_VARIABLE = someValue;
static void GivenVariable(uint32_t para)
static __attribute__ ((naked)) void Function(int_64 param)
static void Var_Var_var_var(void)


/* negatives */
static const char hex[] = "000000"
static uint8_t variableHandler(uint32_t argc, char **argv)
static volatile Data_type variable
static void variable
static int *variable
static char *variablename = "just a name";
static inline void variable_enable(void)
static volatile bool_t variableIsVariable;
  static const Variabletype_t definedVariable =

任何想法或替代方案都会非常有帮助!提前致谢!

标签: regexperl

解决方案


你可以试试这个伙伴

^\s*static\s(?:(const|inline|volatile|void)\s)?(unsigned\s)?([A-Za-z_]\w+\s[A-Z]\w+)$

解释

  • ^- 匹配字符串的开头。
  • \s*- 匹配空间零次或多次。
  • static\s?- 匹配staticstatic
  • (?:(const|inline|volatile|void)\s)?- 匹配constorinlinevolatileorvoid后跟一个空格。(?使其可选)。
  • (unsigned\s)?- 比赛unsigned
  • ([A-Za-z_]\w+\s[A-Z]\w+)- 匹配任何以字母开头,后跟一个或多个单词字符,后跟空格,后跟一个大写字母,后跟一个或多个字符的内容。
  • $- 字符串结束。

演示


推荐阅读