2010-09-10 12 views
5

Was ist die maximale Größe eines regulären Ausdrucks in modernen Browsern (z. B. Firefox 3+, Safari 4+, IE 7+)? Angenommen, ein einfacher regulärer Ausdruck, sagen wir "foo | bar | baz | woot | ..."Maximale Größe/Länge des regulären Ausdrucks in "modernen" Webbrowsern?

+8

Wenn Sie fragen müssen, machen Sie es falsch ... –

+2

@Andrew Oder vielleicht macht er seine Master-Thesis über esoterische Browser-Grenzen. – treeface

+2

Oder ich bin natürlich neugierig. – Tyson

Antwort

9

Sie können diesen Code verwenden, um in IE8/Firefox mit Firebug/Chrome zu testen.

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

Wenn Sie einen Fehler erhalten, haben Sie das Limit gefunden.


einfacher Test

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 

ERGEBNISSE

In Firefox 3.6.3 (Ubuntu 32 Bit) ich Fehler, wenn ich einen regulären Ausdruck mit 9M Zeichen versucht, (9.999.990 Zeichen) 3.204.161 Zeichen. Mit 3.204.160 ist es in Ordnung.

In Chrome 5.0.3 ist das Limit etwas zwischen 20M und 25M Zeichen.

Der Fehler in Firefox, ist:

script stack space quota is exhausted 

Hinweis: Wenn Sie einige Tests haben, bitte hier kommentieren.

+3

Viele Distributionen begrenzen den Stack-Speicherplatz auf 10 MB, das ist wahrscheinlich das, was Sie treffen. – Chris

+0

@Chris danke für deinen Kommentar, aber das Top ist in der Nähe von 3M Chars ... Ich versuche, die genaue Nummer zu bekommen. – Topera

+0

Es klingt wie für alle praktischen Zwecke, RegEx Größe ist praktisch unbegrenzt. Jetzt werde ich in das Kaninchenloch gehen, um die Leistung von absurd großen regulären Ausdrücken zu bestimmen. :) – Tyson

-1

Wenn Ihr regulärer Ausdruck so einfach ist, warum nicht nur eine Schleife haben, die String-Vergleiche tut:

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

Dann müssen Sie nicht über Browser Einschränkungen Sorge, und es wird wahrscheinlich ausführen viel besser als Ergebnis (da die Version mit regulärem Ausdruck die Regex analysieren und kompilieren müsste, würde es eine Menge Rückverfolgung geben usw.).

+0

Stimmt, aber es beantwortet die Frage nicht. – Bergi

2

Bestimmte reguläre Ausdrücke erfordern exponentielle Speichermengen zur Auswertung. Da Firefox das auf dem Stack macht, der auf vielen Linux-Distributionen auf 10 MB begrenzt ist und in Windows noch kleiner ist (zumindest einige Firefox-Versionen), können Sie das Limit ziemlich schnell erreichen, wenn Sie einen regulären Ausdruck verwenden, der exponentiellen Speicher benötigt in DFA-Formular konvertieren, um auszuwerten.

Verwandte Themen