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?
Antwort
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.
Viele Distributionen begrenzen den Stack-Speicherplatz auf 10 MB, das ist wahrscheinlich das, was Sie treffen. – Chris
@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
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
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.).
Stimmt, aber es beantwortet die Frage nicht. – Bergi
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.
- 1. Was ist die Komplexität des regulären Ausdrucks?
- 2. Wie Whitespace-insensitive Modus des regulären Ausdrucks in PHP aktivieren?
- 3. Teil eines regulären Ausdrucks negieren
- 4. Verwenden Variable als regulären Ausdrucks
- 5. Erstellen eines dynamischen regulären Ausdrucks
- 6. Auf Übereinstimmungsdaten des regulären Ausdrucks von Scala Parser zugreifen
- 7. Endbenutzer-Tool zum Generieren eines regulären Ausdrucks
- 8. Wie lautet der Name dieses regulären Ausdrucks?
- 9. Regulärer Ausdruck zum Finden eines regulären Ausdrucks?
- 10. Wird CSS neben Webbrowsern verwendet?
- 11. Konvertieren eines vereinfachten regulären Ausdrucks in einen Syntaxbaum
- 12. Konstruieren eines regulären Ausdrucks aus einem endlichen Automaten
- 13. Bestimmen des Typs eines Ausdrucks
- 14. Illegaler Beginn des einfachen Ausdrucks in Scala
- 15. Angular: Ausdrücken des Ausdrucks in das Komponentenattribut
- 16. Stift-/Stylus-Unterstützung in Webbrowsern
- 17. Fehler beim Starten des modernen Compilers
- 18. Was bedeutet "\ 2" am Ende eines regulären Ausdrucks?
- 19. Wie ein Muster eines regulären Ausdrucks aus string
- 20. Suche nach einem Muster eines regulären Ausdrucks und libgit2 mit
- 21. Hilfe Verkürzung eines regulären Ausdrucks mit wiederholten Untermustern
- 22. Anwenden eines regulären Ausdrucks auf einen Java-E/A-Stream
- 23. Nginx Map verwendet nicht die Argumente meines regulären Ausdrucks
- 24. Wie erzeuge ich Jmeter CSV-Bericht nur mit definierten Variablen des regulären Ausdrucks
- 25. Welche Werkzeuge gibt es zum Debuggen/Durchlaufen eines regulären Ausdrucks?
- 26. Übereinstimmen eines regulären Ausdrucks mit einer Zeichenfolge (Dateiname)
- 27. Referenzieren eines Satzes von Dateipfaden unter Verwendung eines regulären Ausdrucks
- 28. Codenameon: Alternative zu WebBrowsern
- 29. Reihenfolge des regulären Ausdrucksoperators (.. | .. ... .. | ..)
- 30. Art des Ausdrucks ist mehrdeutig | SpringyCollectionViewFlowLayout
Wenn Sie fragen müssen, machen Sie es falsch ... –
@Andrew Oder vielleicht macht er seine Master-Thesis über esoterische Browser-Grenzen. – treeface
Oder ich bin natürlich neugierig. – Tyson