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?

Était-ce utile?

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

De perlfaq6: Qu'est-ce que cela signifie que les expressions rationnelles sont cupides? Comment puis-je contourner?


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;

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top