2010-09-10 10 views

risposta

9

Puoi utilizzare questo codice per testare in IE8/firefox con firebug/Chrome.

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)); 
    } 
} 

Quando si verifica un errore, hai trovato il limite.


TEST SEMPLICE

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 

RISULTATI

In Firefox 3.6.3 (Ubuntu 32 bit) ottengo l'errore quando ho provato una regex con caratteri 9M (9.999.990 caratteri) 3.204.161 caratteri. Con 3.204.160 va bene.

In Chrome 5.0.3 il limite è tra 20 e 25 M caratteri.

L'errore, in Firefox, è:

script stack space quota is exhausted 

Nota: Se avete fatto un po 'di prova, si prega di commentare qui.

+3

Molte distribuzioni limitano lo spazio dello stack a 10 MB, quindi è probabilmente quello che stai colpendo. – Chris

+0

@ Chris ringrazia per il tuo commento, ma la parte superiore è vicino ai caratteri 3M ... Sto cercando di ottenere il numero esatto. – Topera

+0

Sembra come per tutti gli scopi pratici, la dimensione RegEx è praticamente illimitata. Ora vado giù nella tana del coniglio per determinare l'esecuzione di espressioni regolari assurdamente grandi. :) – Tyson

-1

Se l'espressione regolare è semplice come quello, perché non basta avere un ciclo che fa confronti di stringhe:

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; 
    } 
} 

Allora non dovete preoccuparvi di limitazioni del browser, ed è probabile che esegue molto meglio come risultato (dal momento che la versione dell'espressione regolare dovrebbe analizzare e compilare la regex, ci sarebbe un sacco di back tracking, e così via).

+0

Vero, ma non risponde alla domanda. – Bergi

2

Alcune espressioni regolari richiedono una quantità di memoria esponenziale da valutare. Dato che Firefox lo fa in pila, che è limitato a 10 MB su molte distribuzioni Linux, e ancora più piccolo in Windows (almeno alcune versioni di Firefox), potresti raggiungere il limite abbastanza rapidamente se usi un'espressione regolare che richiede memoria esponenziale per convertire in forma DFA per valutare.

Problemi correlati