Estaba revisando una publicación anterior y noté que varias personas sugerían que no usara Regex para analizar xml. En ese caso, el xml era relativamente simple, y Regex no presentaba 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"?¿Por qué es una mala idea analizar XML con expresiones regulares?
Respuesta
El problema real son las etiquetas anidadas. Las etiquetas anidadas son muy difíciles de manejar con expresiones regulares. Es posible con balanced matching, pero eso solo está disponible en .NET y tal vez un par de 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 un asunto difícil de analizar ...
<div>
<div id="parse-this">
<!-- oops</div> -->
try to get this value with regex
</div>
</div>
usted podría estar persiguiendo a casos extremos como éste durante horas con una expresión regular, y tal vez encontrar 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.
Debe incluir algunas entidades de caracteres numéricos o entidades de definición de DTD solo para hacerlo más difícil :-p. – binki
Esto ha sido discutido tantas veces aquí en SO. Ver p.
Can you provide some examples of why it is hard to parse XML and HTML with a regex?
Why it's not possible to use regex to parse HTML/XML: a formal explanation in layman's terms
sólo tiene que seguir los enlaces en la parte derecha de la pantalla para obtener más respuestas.
Mi conclusión:
simple, debido a que 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 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, porque eso no coincide con el patrón nunca más.
Xpath es una especie de Regex para XML. el problema es que las expresiones regulares no comprenden la recursión. –
@AK_ XPath no es un tipo de Regex. * [XPath] (http://en.wikipedia.org/wiki/XPath) es un lenguaje de consulta para seleccionar nodos de un documento XML *. Eso no tiene nada que ver con regex. Y dudo que hayas entendido mi respuesta. El problema no es que las expresiones regulares no entiendan la recursión, lo hacen: [ver regular-expresión.info] (http://www.regular-expressions.info/recurse.html). El problema es que (ht | x) ml puede verse muy diferente, pero tiene el mismo resultado. Con mucho esfuerzo [puede analizar (ht | x) ml con expresiones regulares] (http://stackoverflow.com/a/4234491/626273), pero un analizador existente es mucho más simple de usar – stema
1. Qué está refiriendo a, son extensiones. Estas no son expresiones regulares, en el sentido ComSci. 2. Por favor, lea [esto] (http://en.wikipedia.org/wiki/Chomsky_hierarchy) y las cosas de fondo. es fácil formular un documento xml que sería impermeable a regex. 3. XPath y Xsd, se pueden usar ** en la práctica ** para algunas de las cosas que se pueden hacer con Regex, como la validación, y buscando cosas en los documentos. son similares en el sentido ... retórico :-) –
XML no es un lenguaje normal (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.
Las expresiones regulares se diseñaron inicialmente para manejar únicamente los lenguajes normales, pero las implementaciones modernas incluyen "lookarounds", "backreferences" y en ocasiones una coincidencia equilibrada. Eso le permite adentrarse en un lenguaje un poco más complejo. Pero todavía no es suficiente para algo tan complejo como XML o html. –
Nunca he visto un intento de analizar XML utilizando una expresión regular que no se rompa en algún contenido (por ejemplo, algo adecuadamente similar a XML dentro de un comentario o Sección CDATA). Así que la única situación aceptable para usar una expresión regular es cuando no te importa si no siempre funciona. –
Estoy de acuerdo. Solo quería mencionar todo el lenguaje habitual porque una vez hice el mismo argumento, y luego se dio cuenta de mi error. –
- 1. Usar expresiones regulares para analizar HTML: ¿por qué no?
- 2. ¿Es una mala idea ini_set ('max_execution_time', 0) una mala idea?
- 3. ¿Por qué continuar en un ciclo es una mala idea?
- 4. ¿Por qué es una mala idea permitir esto en JavaScript ==,! =, ++, -
- 5. Cómo analizar una cadena sin expresiones regulares
- 6. ¿Por qué las expresiones regulares se llaman expresiones "regulares"?
- 7. Usando Parsec para analizar expresiones regulares
- 8. ¿Los hilos de fondo son una mala idea? ¿Por qué?
- 9. Prolog Beginner - ¿Es esta una mala idea?
- 10. Java: cómo analizar doble de expresiones regulares
- 11. Linq, es select(). SingleorDefault() ¿una mala idea?
- 12. ¿Es una mala idea capturar OutOfMemoryError?
- 13. contentDescription = "@ null" una mala idea?
- 14. ¿Es * {position: relative} una mala idea?
- 15. ¿Por qué es solo una identificación en la ruta de URL una mala idea para SEO?
- 16. Rubí Separar una cadena con expresiones regulares
- 17. ¿Qué es un límite de palabras en expresiones regulares?
- 18. expresiones regulares en Javascript con jQuery Contiene expresiones regulares extensión
- 19. ¿Por qué es una mala idea usar ClientLogin para aplicaciones web en la API de Google?
- 20. ¿Por qué es una mala idea guardar datos dinámicos en web.config?
- 21. ¿Por qué la captura (excepción) casi siempre es una mala idea?
- 22. Prisma: ¿mala idea usarlo?
- 23. ¿Qué son buenas expresiones regulares?
- 24. ¿Cómo usar expresiones regulares para analizar HTML en Java?
- 25. Multiplicación con expresiones regulares .NET
- 26. ¿Es una mala idea agregar índices a un servidor SQL?
- 27. ¿Es una mala idea saltar a LINQ to SQL ahora?
- 28. expresiones regulares para analizar los números de coma flotante internacionales
- 29. Usar demasiados PHP incluye una mala idea?
- 30. ¿Es posible tener expresiones regulares que coincidan con todas las expresiones regulares válidas?
tal vez porque ya hay miles de analizadores xml, incluidos los analizadores _completados en_ lenguajes de programación y marcos como GTK. – ApprenticeHacker
@Michael esperando el enlace. – ApprenticeHacker
Puede usar regex para extraer bits de información de pequeños fragmentos de XML predecibles y restringidos, no hay problema, pero regex no está pensado para ** analizar ** XML como un todo. Es como usar un martillo de bolas para pelar una naranja. – BoltClock