¿Por qué es una mala idea analizar XML con expresiones regulares?

Estaba revisando una publicación anterior que hice y noté que varias personas sugerían que no usara Regex para analizar xml. En ese caso, el xml fue relativamente simple, y Regex no planteó ningún problema. También estaba analizando varios otros formatos de código, por lo que en aras de la uniformidad tenía sentido. Pero tengo curiosidad de cómo esto podría plantear un problema en otros casos. ¿Es solo un tipo de problema de “no reinventar la rueda”?

El verdadero problema son las tags anidadas. Las tags anidadas son muy difíciles de manejar con expresiones regulares. Es posible con la equivalencia equilibrada , pero eso solo está disponible en .NET y quizás en algunos otros sabores. Pero incluso con el poder de la concordancia equilibrada, un comentario mal colocado podría descartar la expresión regular.

Por ejemplo, este es complicado de analizar …

try to get this value with regex

Podría estar persiguiendo casos extremos como este durante horas con una expresión regular, y quizás encuentre una solución. Pero realmente, no tiene sentido cuando hay analizadores XML, XHTML y HTML especializados que hacen el trabajo de manera más confiable y eficiente.

Esto se ha discutido muchas veces aquí en SO. Ver por ej.

¿Puede proporcionar algunos ejemplos de por qué es difícil analizar XML y HTML con una expresión regular?

Por qué no es posible usar expresiones regulares para analizar HTML / XML: una explicación formal en términos simples

Simplemente siga los enlaces en el lado derecho de la pantalla para obtener más respuestas.

Mi conclusión:

Simple, porque una expresión regular no es un analizador , es una herramienta para encontrar patrones .

Si desea encontrar un patrón muy específico en un archivo (ht | x) ml, continúe, regex es perfecto para eso.

Pero si busca algo en cada etiqueta de Foo, que podría tener atributos en diferentes órdenes, que pueden anidarse, que pueden estar mal formados (y aún válidos), entonces use un analizador sintáctico, porque ya no es coincidencia de patrones.

XML no es un lenguaje regular (es un término técnico) por lo que nunca podrá analizarlo correctamente utilizando una expresión regular. Puede ser exitoso el 99% del tiempo, pero luego alguien encontrará una forma de escribir el XML que lo arroja.

Si está escribiendo algún tipo de raspador de pantalla, entonces una tasa de éxito del 99% podría ser adecuada. Para la mayoría de las aplicaciones, no lo es.