Todo este meme cthulhu-never-parse-xml-with-regex tiene que morir. Gritar no te hace bien. Jurar no te hace bien. Incluso usar unicode para hacer que tu texto se vea extraño no te hace correcto.
Este meme es técnicamente correcto pero básicamente está mal. Es técnicamente correcto en el sentido de que una única expresión regular clásica no es capaz de reconocer el conjunto de documentos XML válidos. Pero decir que, por lo tanto, “no puede analizar xml con expresiones regulares” es como decir que “no puede hacer estallar las cosas con dinamita”, porque la dinamita, después de todo, no se encenderá sin un fósforo, y necesita el oxígeno del aire para alimenta la combustión: es una pedantería irritante.
Entonces, solo para dejar las cosas claras:
- ¿Cuáles son los problemas no resueltos de la informática?
- ¿De qué manera Google Scholar se queda corto?
- ¿Qué pasaría si el trabajo de un investigador extranjero en un laboratorio de investigación estadounidense no clasificado comienza a tener aplicaciones militares?
- ¿Cuáles son algunas startups en Inteligencia Artificial?
- ¿Cuándo tiene sentido informar el tiempo de CPU y / o tiempo de pared en publicaciones de informática?
1) Los analizadores usan expresiones regulares. Los analizadores suelen estar formados por dos componentes: un escáner escrito como una expresión regular y un analizador escrito como una gramática libre de contexto. Si has oído hablar de las herramientas de Unix lexx y yacc, bueno, la primera es para escribir escáneres y la segunda es para escribir analizadores. Lexx es solo una herramienta elegante para escribir expresiones regulares.
De hecho, es bastante inusual encontrar * any * parser que * no * usa expresiones regulares. La biblioteca del combinador Haskell Parsec le permite combinar el lexing y el análisis en uno; y los analizadores Packrat no requieren una fase de escaneo separada. Casi todo lo demás usa expresiones regulares (o máquinas de estado finito escritas a mano).
2) Los analizadores HTML usan expresiones regulares. El código fuente del analizador HTML de Python está aquí: http://hg.python.org/cpython/fil…
Echa un vistazo a las líneas 16-65. Nada más que expresiones regulares. El analizador de Python, como la mayoría de los analizadores para HTML, SGML o XML, depende completamente de la expresión regular. Acabo de revisar varios analizadores similares, algunos de los de bajo nivel como Xerces o expat no usan bibliotecas de expresiones regulares, pero todavía tienen fases de escáner con sus características máquinas de estados finitos.
Entonces, decir “no use expresiones regulares para analizar HTML; en su lugar, use un analizador sintético” es como decir “no use un motor para viajar largas distancias; pruebe con un automóvil”. Tonterías ignorantes.
3) De hecho, la fase de escaneo es prácticamente todo lo que hay para analizar HTML. En un lenguaje como, por ejemplo, C, el analizador de gramática a menudo será mucho más complicado que el escáner. Esto se debe a que debe tratar con todos los patrones estructurales anidados complejos de C: debe saber qué “otro” pertenece a qué “si”, cuándo x * * y es una declaración y cuándo es multiplicación y desreferencia, y así sucesivamente. HTML no tiene ese tipo de complejidad estructural. Básicamente son solo etiquetas dentro de las etiquetas. De hecho, los analizadores XML o HTML a menudo funcionan en modo SAX, que en realidad es solo un escáner. El analizador gramatical para HTML, cuya complejidad canosa supuestamente impide que alguien analice HTML con una expresión regular, literalmente podría escribirse como una breve declaración de cambio dentro de un ciclo while.
La verdadera razón por la que no debe usar una expresión regular para analizar XML es que XML es una abominación demasiado complicada, cuyo procesamiento correcto es imposible sin una gran cantidad de código. Un procesador XML correcto tiene que manejar espacios de nombres, referencias de entidades, codificaciones, CDATA, instrucciones de procesamiento y un sinfín de cosas de las que nunca has oído hablar y que no te importan.
HTML, por el contrario, tiene un estándar de facto de “lo que funcionará en al menos los navegadores más dominantes”, y en la práctica puede analizarlo con expresiones regulares, y en la práctica todos lo hacen.
Finalmente, me gustaría decir que no siempre confíe en la sabiduría convencional del programador o en la multitud en StackOverflow. Es el equivalente digital de mierda alrededor del enfriador de agua. (Lo mismo ocurre con Quora).
Si está buscando analizar HTML con expresiones regulares, miraría el analizador de python que publiqué anteriormente, o el que está aquí: https://github.com/tautologistic… o simplemente mire a su alrededor. La teoría se explica en libros como “Introducción a la teoría de autómatas, lenguaje y computación”, pero probablemente sea mucho más esfuerzo tratar de aprender todo eso que comprender un simple analizador basado en expresiones regulares.