2010-09-10 18 views
5

¿Cuál es el tamaño máximo de una expresión regular en los navegadores modernos (es decir, Firefox 3+, Safari 4+, IE 7+)? Asumir una expresión regular simple, de, por ejemplo "foo | bar | Baz | woot | ..."¿Tamaño/longitud máxima de expresión regular en navegadores web "modernos"?

+8

Si tiene que preguntar, lo está haciendo mal ... –

+2

@Andrew O tal vez está haciendo su tesis de maestría sobre los límites del navegador esotérico. – treeface

+2

O soy curioso por naturaleza. – Tyson

Respuesta

9

Usted puede utilizar este código para probar, en IE8/Firefox con Firebug/cromo.

var regex = ""; 
var maximum = 100; 
var showAfter = 95; 
for(i = 1; i < maximum; i++) { 
    regex += "aaaaaaaaaa"; 
    if (i > showAfter) { 
     console.log(10 * i + " chars"); 
     console.log(RegExp(regex)); 
    } 
} 

Cuando obtiene un error, encuentra el límite.


prueba simple

var regex = ""; 
var chars = 3204161; 
for(i = 0; i < chars; i++) { 
    regex += "a"; 
} 
alert(chars + " chars"); 
var a = RegExp(regex); // don't send to console, to be faster 

RESULTADOS

En Firefox 3.6.3 (Ubuntu 32 bits) consigo error cuando intenté una expresión regular con caracteres 9M (9.999.990 caracteres) 3.204.161 caracteres. Con 3.204.160 está bien.

En Chrome 5.0.3 el límite es algo entre 20M y 25M caracteres.

El error, en Firefox, es:

script stack space quota is exhausted 

Nota: Si usted hizo alguna prueba, por favor comentar aquí.

+3

Muchas distribuciones limitan el espacio de la pila a 10 MB, por lo que es probable que sea eso lo que estás golpeando. – Chris

+0

@Chris gracias por su comentario, pero la parte superior está cerca de 3M caracteres ... Estoy tratando de obtener el número exacto. – Topera

+0

Parece que para todos los propósitos prácticos, el tamaño de RegEx es prácticamente ilimitado. Ahora voy a ir por el agujero del conejo para determinar el rendimiento de expresiones regulares absurdamente grandes. :) – Tyson

-1

Si la expresión regular es tan simple como que, ¿por qué no tener un bucle que hace comparaciones de cadenas:

var input = "woot"; 

var tests = ["foo", "bar", "baz", "woot"]; 
for(i = 0; i < tests.length; i++) { 
    if (tests[i] == input) { 
     alert("match found: #" + i); 
     break; 
    } 
} 

Entonces usted no tiene que preocuparse por las limitaciones del navegador, y es probable que realizar mucho mejor como resultado (ya que la versión de expresión regular tendría que analizar y compilar la expresión regular, habría un montón de seguimiento, etc.).

+0

Es cierto, pero no responde la pregunta. – Bergi

2

Ciertas expresiones regulares requieren cantidades exponenciales de memoria para evaluar. Dado que Firefox hace esto en la pila, que está limitado a 10 MB en muchas distribuciones de Linux, e incluso más pequeño en Windows (al menos algunas versiones de Firefox), puedes alcanzar el límite bastante rápido si usas una expresión regular que requiere memoria exponencial para convertir a formato DFA para evaluar.

Cuestiones relacionadas