Использование регулярного выражения для фильтрации директив препроцессора?

Я должен отфильтровать из огромного количества файлов cpp все определенные макросы, за исключением охранников, например:

#if <NAME>
#ifdef <NAME>
#ifndef <NAME>
#if defined(<NAME>)
#if defined <NAME>
!defined(<NAME>)
!defined <NAME>
#else if <NAME>
#elif <NAME>

Мне нужно получить все ИМЕНА, но они не все в форме XXX, из-за того, что над проектом работают разные программисты, существует много определений, поэтому я сталкиваюсь с проблемами при определении регулярного выражения который может экстраполировать только <NAME> из каждой из только что описанных ситуаций.

Любой совет приветствуется!

EDIT Как кто-то указал, мое ИМЯ (с окружением ‹) является только заполнителем, где на самом деле это может быть XXXX, XXXX, _XX_Y_, _XXX , _XXX_Y, XXYY, где X и Y могут быть заглавными буквами или цифрами без какой-либо регулярности в имени! это директивы для препроцессора, и я должен их отфильтровать


person panc_fab    schedule 09.02.2017    source источник
comment
Это работа для grep или awk, в зависимости от того, что вам нужно сделать с линиями, которые вы найдете.   -  person Pete Becker    schedule 09.02.2017


Ответы (1)


Быстро проверил это с помощью http://regexr.com с предоставленными вами примерами. Соответствует большинству случаев.

Возможно, вам придется немного доработать его.

([#!][A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)([\\(]?[^\s\\)]{1,}[\\)]?)?

Краткое объяснение:

([#!][A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)

Соответствует (большинству) строк, начинающихся с '#' или '!', и директивы. Второе слово также разрешено, пробелы игнорируются (оно будет совпадать с n пробелами и без них)

([\(]?[^\s\)]{1,}[\)]?)?

Будет соответствовать строкам как в скобках, так и без скобок. Не будет соответствовать, если внутри скобок есть пробелы.

Если вы хотите сопоставить пробелы внутри квадратных скобок, измените ^\s\) на ^\)

Обновить Некоторые символы возврата не отображались в ответе. Зарезервированные символы, например: []{}() и т. д., должны быть экранированы. Исправил ответ. Возможно, пропустил один или два, извините в таком случае.

Обновление от 05.03.2020 @gregn3 предоставил обновленную версию в комментариях, в которой разрешены пробелы между # и следующим словом.

([#!][ \t]*[A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)([\\(]?[^\s\\)]{1,}[\\)]?)?
person SimonC    schedule 09.02.2017
comment
Вот еще примеры синтаксиса директив препроцессора. Между # и define могут быть пробелы и табуляции, но больше ничего. Это обновленная версия вашего регулярного выражения: ([#!][ \t]*[A-z]{2,}[\s]{1,}?([A-z]{2,}[\s]{1,}?)?)([\\(]?[^\s\\)]{1,}[\\)]?)? (добавлено [ \t]* после исходного [#!]) - person gregn3; 05.03.2020