2011-09-26 35 views
6

Después de algunas investigaciones, pensé que no es posible analizar estructuras recursivas (como HTML o XML) usando expresiones regulares. ¿Es posible enumerar exhaustivamente los escenarios de codificación cotidianos en los que debería evitar el uso de expresiones regulares porque es simplemente imposible hacer esa tarea en particular utilizando expresiones regulares? Digamos que el motor de expresiones regulares en cuestión no es PCRE.¿Cuándo no debería usar expresiones regulares?

+1

Creo que su pregunta es demasiado amplia. No está lejos de "cuándo usar una herramienta". Realmente no se puede esperar una respuesta definitiva para todos los casos posibles, ¿verdad? Cuándo usar una herramienta: cuando la entiende, cuando simplifica su trabajo, cuando hace que el código sea más claro en lugar de más complicado ... ¿Cuándo usar Regex? Cuando necesita emparejar patrones contra cadenas. No se puede hacer mucho mejor que eso. – Kobi

+0

Estoy de acuerdo en que 'cuándo usar regex' es una pregunta amplia. Pero creo que es útil estar al tanto de los escenarios comunes en los que no puede usar expresiones regulares para realizar una tarea en particular. Esto ahorrará mucho tiempo al desarrollador. –

+0

Vea también esta pregunta, con un [ejemplo de "análisis con expresiones regulares"] (http://stackoverflow.com/a/15589159/287948). –

Respuesta

26

No utilice expresiones regulares cuando:

  • el idioma que está tratando de analizar no es un regular language o
  • cuando hay analizadores fácilmente disponibles hechos específicamente para los datos que está tratando de analizar .

Analizar HTML y XML con expresiones regulares suele ser una mala idea, ya que no son lenguajes comunes y porque ya existen bibliotecas que pueden analizarlo por usted.

Como otro ejemplo, si necesita verificar si un entero está en el rango 0-255, es más fácil de entender si usa las funciones de biblioteca de su idioma para analizarlo en un entero y luego verificar su valor numérico en lugar de intentarlo para escribir la expresión regular que coincida con este rango.

+1

Respuesta EPIC. Puntos completos –

+2

Puntos completos siendo uno! +1 –

+0

Entiendo eso, pero solo quiero saber algunos escenarios cotidianos de codificación en los que debería mantenerme alejado de las expresiones regulares. Tal como analizar HTML o XML. –

2

Mi regla de oro es usar expresiones regulares cuando no existe otra solución. Si ya hay un analizador (por ejemplo, XML, HTML) o simplemente busca cadenas en lugar de patrones, no es necesario usar expresiones regulares.

Siempre pregúntese "¿Puedo resolver esto sin usar expresiones regulares?". La respuesta a esa pregunta le dirá si debe usar expresiones regulares.

7

voy a plagiar a mí mismo de mi blog, When to use and when not to use regular expressions ...

sitios web públicos no deben permitir que los usuarios introducir expresiones regulares para la búsqueda. Dar todo el poder de regex al público en general para el motor de búsqueda de un sitio web podría tener un efecto devastador. Existe algo así como un ataque regular expression denial of service (ReDoS) que debe evitarse a toda costa.

El análisis HTML/XML no debe hacerse con expresiones regulares. En primer lugar, las expresiones regulares están diseñadas para analizar un regular language que es el más simple entre el Chomsky hierarchy. Ahora, con la llegada de las definiciones de grupos de equilibrio en el sabor .NET de las expresiones regulares, puede aventurarse en un territorio un poco más complejo y hacer algunas cosas con XML o HTML en situaciones controladas. Sin embargo, no tiene mucho sentido. Hay analizadores disponibles para XML y HTML que harán el trabajo más fácilmente, más eficientemente y de manera más confiable. En .NET, XML puede manejarse de la manera antigua XmlDocument o incluso más fácilmente con Linq to XML. O para HTML, está el HTML Agility Pack.

Conclusión

Las expresiones regulares tienen su utilidad. Todavía sostengo que en muchos casos pueden ahorrarle al programador mucho tiempo y esfuerzo. Por supuesto, dados los recursos de tiempo infinito &, casi siempre se podría construir una solución de procedimiento que sea más eficiente que una expresión regular equivalente.

Su decisión de abandonar la expresión regular debe basarse en 3 cosas:

1.) ¿La expresión regular es tan lenta en su escenario que se ha convertido en un cuello de botella?

2.) ¿Es su solución de procedimiento realmente más rápida & más fácil de escribir que la expresión regular?

3.) ¿Hay un analizador especializado que hará el trabajo mejor?

+0

Gracias, Steve. ¡Tu publicación de blog se borra mucho! –

Cuestiones relacionadas