2010-09-10 54 views
5

現代瀏覽器(即Firefox 3 +,Safari 4 +,IE 7+)中正則表達式的最大大小是多少?假設一個簡單的正則表達式,例如「foo | bar | baz | woot | ...」「現代」網絡瀏覽器中正則表達式的最大大小/長度?

+8

如果你不得不問,你做錯了...... – 2010-09-10 00:09:36

+2

@Andrew或者他也許正在做他的碩士論文在深奧的瀏覽器限制。 – treeface 2010-09-10 00:11:17

+2

或者我自然好奇。 – Tyson 2010-09-10 20:30:44

回答

9

您可以使用此代碼在IE8/firefox中用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)); 
    } 
} 

當您收到錯誤時,您找到了該限制。


SIMPLE 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 

成績

在Firefox 3.6.3(Ubuntu的32位),收到錯誤時,我試圖一個正則表達式與 9M字符(9.999.990個字符) 3.204.161個字符。隨着3.204.160沒關係。

在Chrome 5.0.3中,限制是20M到25M之間的字符。

錯誤,在Firefox中,就是:

script stack space quota is exhausted 

注意:如果你做了一些測試,請在這裏評論。

+3

許多發行版將堆棧空間限制爲10 MB,因此這可能就是您打的。 – Chris 2010-09-10 00:32:25

+0

@克里斯感謝您的評論,但頂部接近3M的字符...我試圖得到確切的數字。 – Topera 2010-09-10 00:37:54

+0

這聽起來就像所有實際用途一樣,RegEx大小實際上是無限的。現在我要走下決定荒謬大正則表現的兔子洞。 :) – Tyson 2010-09-10 20:38:19

-1

如果你的正則表達式是簡單的樣子,爲什麼不只是有一個循環,它的字符串比較:

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

那麼你不必擔心瀏覽器的限制,它很可能會進行多(因爲正則表達式版本將不得不分析和編譯正則表達式,所以會有大量的後臺跟蹤等等)。

+0

是的,但它不回答這個問題。 – Bergi 2013-04-22 11:13:13

2

某些正則表達式需要指數量的內存來評估。由於Firefox在堆棧上執行此操作(在許多Linux發行版上限制爲10 MB,在Windows中限制更小)(至少某些版本的Firefox),如果使用需要指數內存的正則表達式,則可以相當快地達到限制轉換爲DFA表單進行評估。

相關問題