Domanda

Sono nuovo di Lex e voglio prendere tutte le corrispondenze specifiche per un'espressione regolare

ad esempio nel seguente testo:

/* text text

text 
text

text */

text text
/* text text text text text text

text text */

Voglio scegliere le due corrispondenze tra / * e * /

ma lex corrisponde all'intera corrispondenza esterna e non restituisce i due! Uso questa espressione:

\/\*(.|\n)*\*\/

Come selezionare le corrispondenze interne anziché l'intera esterna? grazie

È stato utile?

Soluzione

\/\*([^*]|\n|\*+[^*/])*\*+\/

Quello che sta succedendo è che * è avido - corrisponderà il più a lungo possibile di una stringa. L'espressione precedente tratta il carattere * separatamente assicurando che l'espressione regolare possa continuare solo finché non è seguita dal carattere /. Ciò si ottiene facendo in modo che le unità interne dell'espressione regolare siano

  • un personaggio che non è *
  • una nuova riga
  • una stringa di * s seguita da un carattere che non è /

Alla fine, c'è una stringa di * s seguita da un /. (Nota: una versione precedente non gestiva correttamente questo caso. Vorrei davvero che flex avesse l'operatore *?)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top