Я пишу простой текстовый граббер для предварительного процессора C-Style. Ввод текста (образец):Упрощение регулярного выражения - слишком много групп
#if 1 > 0
blah
#if defined MACRO1
blah blah blah
#if !defined MACRO2
blaaaah
#if ! defined MACRO3
blah?
Я хочу, чтобы захватить текст, который приходит после каждого #if [!] defined
заявления. Вывод, который я должен был бы из приведенного выше текста:
MACRO1
MACRO2
MACRO3
Номера строк, необходимые для захвата здесь 3, 5 и 7. Обратите внимание, что в строке 7 получили пробелы, смешанные с закладками.
Я попытался создать выражения, которые могут дать мне этот результат, но ни один такой блестящий. Мое выражение, которое дает желаемый результат это-
(?<=(?<=(?<=(?<=(?<=(?<=#if)[\s\t]+)!?)[\s\t]*)defined)[\s\t]+).*
использованные опции: Multiline + IgnoreCase
Но я уверен, что это не элегантный и лаконичный. Может ли кто-нибудь предложить лучшее выражение, пожалуйста?
PS - Я использую Expresso для проверки выражения.
Это еще одна альтернатива (спасибо Весселя) : '(? <= #, если [\ s \ t] + [!]? [\ s \ t] * определено [\ s \ t] +). *' – Nayan