cómo seleccionar coincidencias internas en lex
-
03-07-2019 - |
Pregunta
soy nuevo en lex y quiero tomar todas las coincidencias específicas de una expresión regular
por ejemplo en el siguiente texto:
/* text text
text
text
text */
text text
/* text text text text text text
text text */
quiero elegir las dos coincidencias entre / * y * /
¡pero lex coincide con toda la coincidencia externa y no devuelve los dos! Yo uso esta expresión:
\/\*(.|\n)*\*\/
¿Cómo seleccionar coincidencias internas en lugar de las externas? gracias
Solución
\/\*([^*]|\n|\*+[^*/])*\*+\/
Lo que sucede es que * es codicioso: coincidirá con el mayor número de cadenas posible. La expresión anterior trata el carácter * por separado asegurándose de que la expresión regular pueda continuar siempre y cuando no esté seguida por el carácter /. Esto se logra haciendo que las unidades interiores de la expresión regular sean una de
- un personaje que no es *
- una nueva línea
- una cadena de * s seguida de un carácter que no es /
Al final, hay una cadena de * s seguida de /. (Nota: una versión anterior no manejó este caso correctamente. Realmente deseo que flex tuviera el operador *?)