comment sélectionner les correspondances internes dans lex
-
03-07-2019 - |
Question
je suis nouveau sur Lex et je veux prendre tous les matchs spécifiques à une expression régulière
par exemple dans le texte suivant:
/* text text
text
text
text */
text text
/* text text text text text text
text text */
Je veux choisir les deux correspondances entre / * et * /
mais lex correspond à tout le match extérieur et ne renvoie pas les deux! J'utilise cette expression:
\/\*(.|\n)*\*\/
Comment sélectionner des correspondances internes au lieu de toutes les correspondances? merci
La solution
\/\*([^*]|\n|\*+[^*/])*\*+\/
Ce qui se passe, c'est que * est gourmand - il correspondra à une chaîne aussi longue que possible. L'expression précédente traite le caractère * séparément en veillant à ce que l'expression régulière ne puisse continuer que tant qu'elle n'est pas suivie du caractère /. Ceci est accompli en faisant en sorte que les unités intérieures de l'expression régulière soient
- un caractère qui n'est pas *
- une nouvelle ligne
- une chaîne de * s suivie d'un caractère qui n'est pas /
À la fin, il y a une chaîne de * s suivie d'un /. (Remarque: une version précédente ne gérait pas ce cas correctement. Je souhaite vraiment que flex ait l'opérateur *?).