2017-02-09 5 views
-1

я должен отфильтровать из огромного количества 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 Как кто-то указал, мое имя (с surrondings <) только заполнителем, где в действительности это может быть XXXX, XXXX, _XX_Y_, _XXX, _XXX_Y, XXYY, где X и Y может быть заглавные буквы или цифры, без регулярности в имени! они являются директивами для препроцессора, и я должен их отфильтровать.

+0

Это работа для 'grep' или' awk', в зависимости от того, что вам нужно делать с линиями, которые вы найдете. –

ответ

2

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

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

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

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

([#!] [Az] {2,} [\ s] {1} ([Az] {2,} [\ s] {1,}?)?)

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

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

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

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

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

+1

УБЕДИТЕСЬ, ЧТО БЫЛО БЫТЬ! –

Смежные вопросы