come selezionare le corrispondenze interne in lex
-
03-07-2019 - |
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
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 *?)