Директива CPP #ifdef Regex Solution

Я пытаюсь использовать регулярное выражение в Delphi для решения директив C PreProcessor. В качестве примера у меня есть текстовый файл, который содержит

#define test
#ifdef test
foo

#else

bar
#endif

Я хочу знать в своем первом совпадении, если это ifdef или ifndef.
В моем втором матче я хочу получить, что должно (не) быть определено.
Третьим будет все, кроме #else или #endif.
Если это было #else, #else должно быть содержимым совпадения 4.
Матч 5 будет снова соответствовать содержимому, а совпадение 6 будет содержать #endif
КСТАТИ. Меня не волнует \n или\r в матчах. Они будут отфильтрованы.

Моей первой попыткой было следующее регулярное выражение:

/#(ifn?def) +(.*)\n(.*)(#else)?(.*)?(#endif)/si

который абсолютно не работал. И независимо от того, что я пытаюсь, я могу получить только #ifdef и ключ, который должен (не) быть определен + все остальное во втором матче.

Есть ли решение для регулярного выражения? Является ли regex лучшим решением для такого рода вещей?

+2
источник поделиться
1 ответ

Поскольку подвыражения 4 и 5 являются необязательными, жадные второстепенные и третьи подвыражения в конечном итоге поглощают все, даже если #else появляется на вашем входе. Вы должны сделать их неживыми. Чтобы гарантировать, что подвыражение 5 заполняется только в том случае, если подвыражение 4 соответствует, поместите его внутри другого. В итоге вы получите следующее:

/#(ifn?def) +(.*?)\n(.*?)(#else(.*))?(#endif)/si

Я бы сделал подвыражение 4 непривязающей группой, и я бы не стал вообще группировать подвыражение 6, поскольку содержимое обоих можно определить по контексту.

+3
источник

Посмотрите другие вопросы по меткам или Задайте вопрос