2011-10-21 66 views
6

He estado utilizando expresiones regulares durante un par de años y me siento cómodo con ellos, pero me preguntaba si hay alguna limitación al usarlos. Sé sobre las limitaciones relacionadas con la recursión (discutido aquí http://blogs.msdn.com/b/jaredpar/archive/2008/10/15/regular-expression-limitations.aspx). ¿Hay alguna limitación relacionada con la memoria? Supongo que puede capturar una cadena tan grande como pueda caber en la memoria (o que la máquina virtual lo permita).Limitaciones de expresiones regulares?

¿Hay alguna otra limitación con las expresiones regulares que deba conocer?

Gracias de antemano,

Chris

+1

Realmente necesita especificar el motor de expresiones regulares que está utilizando, ya que cada uno tiene límites diferentes. Algunos han ido tan lejos como para permitir algunas expresiones regulares similares a la gramática. Mirando las respuestas de Tchrist (Tom Christiansen) aquí en SO, puedes hacerte una idea de la potencia que han alcanzado algunos motores regex. – ninjalj

Respuesta

5

Limitaciones

  1. no puede resolver todo. (cualquiera en SO diría lo que sucede cuando intente analizar HTML con expresiones regulares)
  2. No debe usarse para todo - problemas de legibilidad y rendimiento. Usar cuando sea apropiado. No para tareas simples, como subcadenas de cadenas, y tampoco para tareas complejas.

En resumidas cuentas, es una herramienta. Úselo como cualquier otra herramienta. No lo use en exceso. No permita que sea la única herramienta en su kit de herramientas.

8

Las expresiones regulares descomunales pueden ser bastante lentas y tener mucha memoria. Lo sé, porque he creado uno. Puede tokenizar lo que no debe ser tokenizado por una expresión regular. :-) si quieres un enlace ... Ahora ... nunca he comparado las expresiones regulares "pequeñas", así que no sé su velocidad. Seguramente son compacto para escribir.

Ah, me estaba olvidando, los regexes son The Evil. Su principal problema es que son como un martillo y cuando los tienes, tratas de hacer que todos los problemas sean como un clavo. Entonces su problema principal está en el usuario (el programador).

Primera limitación "grande": Javascript implementa solo un subconjunto de ellas, sin compatibilidad con Unicode. Normalmente, el idioma que usa en el servidor tiene una implementación más completa, por lo que se limita por js. Incluso las implementaciones bastante completas como la de .NET tienen grandes límites: no admiten pares sustitutos ni soporte para caracteres "compuestos" (caracteres que usan marcas combinadas). Pero, como siempre, el problema está en el programador. ¿Cuántos programadores que conocen Unicode conocen las complejidades de Unicode, de los varios conjuntos de dígitos, de los signos diacríticos?

Segunda "gran" limitación: mantenibilidad. Son complejos e ilegibles cuando están escritos. ¿Pero meses después? ¡Ellos empeoran! Y si tiene que capacitar a un nuevo programador, ahora tiene que aprender un idioma más: regex.

Tercera "gran" limitación: se esconden demasiado. Usted ve \d\s\d. ¿Qué significa? un dígito, un espacio y un dígito? Seguramente. Pero tanto \d como \s en .NET Regexes "esconden" un micromundo. \d "coincide" con cualquier dígito no europeo (y hay muchos muchos en Unicode). \s "coincide" con tantos espacios esotéricos de los que ni siquiera sé el nombre ... Ni siquiera quiero pensar en ello. Son como icebergs. Solo 1/8 está fuera del agua, mientras que 7/8 está oculto. Pero es ese 7/8 que probablemente te matará.

+0

¿Cómo es culpa de Regex si JavaScript solo admite un "subconjunto"? Y la legibilidad no debería ser un problema con las expresiones regulares (que, una vez más, JavaScript no es compatible). Seguramente, puede escribir expresiones gigantes gigantes, sin rendimiento, si no sabe lo que está haciendo (o abusando de la herramienta), del mismo modo que puede escribir programas incorrectos en cualquier idioma. Y -1 para la clasificación "malvada" no calificada que no tiene ni una pizca de sentido. –

+0

@TimPietzcker Dar faltas a un objeto siempre es estúpido. La falla está en el estúpido humano que la creó/proyectó. Regexes no tiene fallas. Ellos son culpables ** y **. Y son culpables ** y ** no solo porque son culpables ** y ** sino porque 1) son hijos de otra era, una era más simple sin unicode o internacionalización y 2) cada programador los "mejoró" en una Manera diferente. De la misma manera, ellos no son * malvados, como un arma no es * malvada *, pero como las armas, hacen que las personas hagan cosas más estúpidas. – xanatos

+0

@TimPietzcker Ahora, el hecho de que hay muchas implementaciones diferentes de Regex ... Esto de alguna manera es un problema. De la misma manera que cuando había muchos unixes (no compatibles entre sí), esta "fragmentación" era un problema. Si tengo que escribir un Regex en ASP.Net, sé que solo puedo usar el subconjunto disponible en JS en Quiero usarlo del lado del cliente y del lado del servidor. Oh, sí, tengo un Ferrari, pero tengo que ir por caminos de tierra ... ¡woah! – xanatos

3

Regexs solo puede analizar las gramáticas regulares de cualquier forma sin contexto y más alto necesita una pila (es decir, un analizador real).

Esa es su única limitación real, el rendimiento depende de la implementación particular, pero en general es lento incluso precompilado en comparación con una máquina de estado.

+5

-1: la mayoría de los motores de expresiones regulares (con la posible excepción de re2, que no he examinado cuidadosamente) han ido más allá de las expresiones regulares puras. – ninjalj

+0

Entonces, ¿usted es uno de los "puristas" que no reconocen expresiones regulares apilables? – xanatos

+0

@ninjalj No estaba al tanto de las expresiones regulares 'no regulares', ¿podría indicarme un ejemplo o artículo? Gracias. –