2011-12-20 9 views
25

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?

+0

tal vez porque ya hay miles de analizadores xml, incluidos los analizadores _completados en_ lenguajes de programación y marcos como GTK. – ApprenticeHacker

+2

@Michael esperando el enlace. – ApprenticeHacker

+4

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

Respuesta

34

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.

+0

Debe incluir algunas entidades de caracteres numéricos o entidades de definición de DTD solo para hacerlo más difícil :-p. – binki

5

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.

+0

Xpath es una especie de Regex para XML. el problema es que las expresiones regulares no comprenden la recursión. –

+0

@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

+0

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 :-) –

3

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.

+1

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. –

+2

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. –

+0

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. –

Cuestiones relacionadas