Как использовать регулярные выражения для сканирования строк кода, которые определяют статическую переменную с начальными именами заглавных букв в файлах .c? - PullRequest
0 голосов
/ 13 декабря 2018

Я использую регулярное выражение для автоматического применения стиля кодирования в базе кода во время проверки кода.У меня возникли проблемы с поиском регулярного выражения для сканирования статических переменных и имен функций, которые начинаются с заглавной буквы в файлах .c, поскольку шаблоны сканирования довольно сложные и динамические, то есть между «статическим» и именем переменной, тамможет быть тип данных, например, int, и ключевое слово, например, const.

Мое текущее решение выглядит следующим образом:

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

Оно работает довольно хорошо для многих шаблонов, но имеет ложные срабатывания, когда тип данных также начинается с заглавной буквы.Например, это было бы положительно для 'static volatile Data_type variableName', даже если '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 =

Любые идеи или альтернативы будут очень полезны!Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 13 декабря 2018

Я только что обновил ваше существующее регулярное выражение,

^\s*static\s((const|inline|volatile)\s)?(unsigned\s)?[a-zA-Z_][\w]+\s\*?[a-zA-Z_][\w]+$
0 голосов
/ 13 декабря 2018

Вы можете попробовать этот помощник

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

Объяснение

  • ^ - Соответствует началу строки.
  • \s* - соответствует нулю или более раз.
  • static\s? - соответствует static или static.
  • (?:(const|inline|volatile|void)\s)? - соответствует const или inline или volatile или void, за которым следует пробел. (? Делает его необязательным).
  • (unsigned\s)? - Соответствует unsigned.
  • ([A-Za-z_]\w+\s[A-Z]\w+) - Соответствует любому началус буквой, за которой следует один или несколько символов слова, за которыми следует пробел, за которым следует заглавная буква, за которой следует один или несколько символов.
  • $ - конец строки.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...