Comment puis-je enlever les commentaires de bloc avec Perl?
Question
Je travaille sur un préprocesseur qui analyse une connexion DSL. Mon but est de supprimer les commentaires.
L'installation de bloc de commentaires est délimité par %%
avant et après. Je n'ai pas à vous soucier %% être dans les chaînes, par la définition de la langue.
J'utilise cette regex s///
. Malheureusement, il semble tout à correspondre et essuyez-le:
#Remove multiline comments.
$text_string =~ s/%%.*%%//msg;
Qu'est-ce que je fais mal?
La solution
la première chose que vous pouvez faire est de rendre non-gourmand:
.*?
sinon,
%% texte %%
contenu réel
%% autre texte %%
seront tous anéantis.
Autres conseils
La plupart des gens pensent que les expressions rationnelles avides correspondent autant que possible. Techniquement parlant, il est en fait les quantificateurs qui sont avides plutôt que le motif entier (*, +, {}?); Perl préfère les gourmandises locales et une gratification immédiate à la cupidité générale. Pour obtenir des versions non gourmandes des mêmes quantificateurs, utilisez (??, * ?, + ?, {}?).
Un exemple:
$s1 = $s2 = "I am very very cold";
$s1 =~ s/ve.*y //; # I am cold
$s2 =~ s/ve.*?y //; # I am very cold
Notez que la seconde substitution arrête la reconnaissance dès qu'il a rencontré « y ». Le *? dit effectivement le moteur d'expression régulière pour trouver un match aussi rapidement que possible et de passer le contrôle à tout ce qui est dans la ligne suivante, comme vous le feriez si vous refiler une patate chaude.
en supposant que vous avez lu le code entier dans la variable $ str et entre %% et %% il n'y a aucune possibilité d'un seul% survenant, vous pouvez l'utiliser.
$ str = ~ s / %% ([^%] + de) %% // g;