Регулярное выражение для поиска всех структур, определенных битовым полем

Мне нужно искать во всех каталогах в кодовой базе C ++ структуры, содержащие битовые поля. Я знаю, что это можно сделать с помощью регулярных выражений, но я не смог собрать правильное выражение для достижения этой цели. В основном мне нужно найти любое вхождение struct * {:} где «*» — любой символ. Спасибо заранее за любые предложения.

1

Решение

(Я игнорирую тот факт, что вам нужно многострочное соответствие; как это сделать отличается от реализации на платформе и в регулярных выражениях (посмотрите на sed!)).

.* сразу после struct слово соответствует чему угодно, включая {и}. Таким образом, строка struct s_one {bool a:3;} one; struct s_two {bool b:4} two; будет только один матч. Хуже,
структурировать {
int noBits;
};

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

будет соответствовать, что не то, что вы хотите (обратите внимание на двоеточие в теле основной функции. Поэтому вы должны вместо этого искать совпадение, имеющее только что-то допустимое между struct и открывающая скобка. Попробуйте, например:

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

который в обычном английском переводит на: «Поиск слова structза которым следуют один или несколько пробелов, за которыми следует допустимое имя идентификатора, состоящее только из заданных символов (один или несколько из них), за которыми может следовать любое количество пробелов, за которым следует фигурная открывающая скобка (мы сейчас внутри определения структуры), за которым следует любой текст, кроме фигурной закрывающей скобки (мы не хотим оставлять определение), где-то есть двоеточие, за которым снова следует любой текст, кроме фигурной закрывающей скобки, за которой следует закрывающая фигурная скобка.

Обратите внимание, что, в зависимости от вашего парсера, вам может понадобиться экранировать фигурные скобки (они имеют специальное обозначение в регулярном выражении). Также обратите внимание, что более простого регулярного выражения также может быть достаточно (например, вы можете удалить что-нибудь за двоеточием, и оно все равно будет работать), но то, что я записал, дает лучшее представление о том, как построить такое регулярное выражение в целом. Также обратите внимание, что это регулярное выражение не учитывает какие-либо формы комментариев внутри кода (например, оно не соответствует

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

(так как one // my favorite first struct не соответствует коду «правильное имя идентификатора» [a-zA-Z0-9_]).

0

Другие решения

Других решений пока нет …