Perl regex multiline ноль или более вхождений - PullRequest
2 голосов
/ 23 марта 2011

У меня есть следующий текст:

#ifdef blah
a
#else 
b
#endif

#ifdef blah
c
#endif

Я хотел бы создать регулярное выражение perl, которое можно использовать для удаления / замены #ifdef blah / #endif и всего, что обернуто ими, и для хранения всего, что находится под #else, если оно существует. Приведенный выше текст после выполнения действия должен быть:

b

Я пробовал что-то вроде этого: perl -i.bak -pe 'BEGIN{undef $/;} s/^#ifdef blah.*(^#else blah(.*))?#endif blah/\2/smg' test.c

Однако, по-видимому, это проблема, помечающая #else как встречающуюся ноль или более раз, и ничего не выбирается.

Ответы [ 2 ]

1 голос
/ 23 марта 2011

Регулярное выражение, которое вы дали, соответствует одному символу после #ifdef blah (который, вероятно, будет новой строкой) и сразу же ожидает увидеть ^#else. Кроме того, судя по всему, вы используете "бла" в качестве подстановочного знака для "чего-либо"?

s/^
   \# \s* ifdef \s+ \w+ \s* \n          # start of ifdef
     .*? \n                             # ignore true case
   (?:
     \# \s* else \s* \n                 # there's an else leg
       (.*? \n)                         # ...so capture it
   )?                                   # or there isn't
   \# \s* endif \s* \n                  # end it
 /defined $1 ? $1 : ''/smgex;           # if we got an else, return it, otherwise do nothing

Обратите внимание, что регулярное выражение не будет правильно обрабатывать вложенные #ifdef (это более простая версия , поэтому вы не должны пытаться анализировать HTML с регулярным выражением ) , Вы можете заставить его работать в этом простом случае с каким-то злом, но он все еще слишком близко подходит к Старым для комфорта. Лучше всего в этом случае использовать настоящий парсер.

Или вы можете отказаться от изобретения колеса и использовать unifdef .

0 голосов
/ 23 марта 2011

Не пробовал это вживую, но этот шаблон должен обмануть:

$whatever ~= s/#ifdef.*?(?:#else\n(.*?))?#endif/\1/si

Обратите внимание, что это не будет проверять для любого #elif (вы могли бы включить его аналогично #else части).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...