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

Était-ce utile?

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 *?).

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