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

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top