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

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

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

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

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

РЕДАКТИРОВАТЬ
Как кто-то указал, мое имя (с окружением < ) является только заполнителем, где на самом деле это может быть XXXX, XXXX, _XX_Y_, _XXX, _XXX_Y, XXYY, где X и Y могут быть заглавными буквами или цифрами, без регулярности в имени! они являются директивами препроцессору, и я должен отфильтровать их

-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 \)
в ^ \)

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

2

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

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

По вопросам рекламы [email protected]