Как я могу удалить комментарии блога с Perl? - PullRequest
1 голос
/ 05 июня 2009

Я работаю над препроцессором, который анализирует DSL. Моя цель - удалить комментарии. Функция комментариев к блоку разграничена %% до и после. Мне не нужно беспокоиться о том, что %% находится в строках, по определению языка.

Я использую это s/// регулярное выражение. К сожалению, похоже, что все совпадает и стирается:

#Remove multiline comments.
$text_string =~ s/%%.*%%//msg;

Что я делаю не так?

Ответы [ 3 ]

9 голосов
/ 05 июня 2009

первое, что вы можете сделать, это сделать его не жадным:

.*?

в противном случае

%% некоторый текст %%

реальный контент

%% другой текст %%

все будут уничтожены.

1 голос
/ 05 июня 2009

С perlfaq6: Что это значит, что регулярные выражения являются жадными? Как я могу обойти это?


Большинство людей имеют в виду, что жадные регулярные выражения совпадают настолько, насколько они могут. Технически говоря, это на самом деле квантификаторы (?, *, +, {}), Которые являются жадными, а не весь шаблон; Perl предпочитает локальную жадность и немедленное удовлетворение общей жадности. Чтобы получить не жадные версии тех же квантификаторов, используйте (??, * ?, + ?, {}?).

Пример:

$s1 = $s2 = "I am very very cold";
$s1 =~ s/ve.*y //;      # I am cold
$s2 =~ s/ve.*?y //;     # I am very cold

Обратите внимание, как вторая подстановка перестала совпадать, как только она встретила "y". *? Квантификатор эффективно сообщает механизму регулярных выражений, что нужно как можно быстрее найти совпадение и передать управление следующему в строке, как если бы вы играли в «горячий картофель».

0 голосов
/ 19 июня 2009

при условии, что вы прочитали весь код в переменную $ str, и между %% и %% не может возникнуть ни одного%, вы можете использовать это.

$ str = ~ s / %% ([^%] +) %% // g;

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