Я должен отфильтровать из огромного количества файлов 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 могут быть заглавными буквами или цифрами, без регулярности в имени! они являются директивами препроцессору, и я должен отфильтровать их
Быстро проверил это с помощью 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 \)
в ^ \)
Обновить
Некоторые из возвратов не были отображены в ответе.
Зарезервированные символы, например: [] {} (), и т. д. нужно сбежать.
Исправлен ответ. Возможно, пропустил один или два, извините в этом случае.
Других решений пока нет …