簡體   English   中英

“現代”Web瀏覽器中正則表達式的最大大小/長度?

[英]Maximum size/length of regular expression in “modern” web browsers?

現代瀏覽器(即Firefox 3 +,Safari 4 +,IE 7+)中正則表達式的最大大小是多少? 假設一個簡單的正則表達式,比如說“foo | bar | baz | woot | ...”

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

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


簡單的測試

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

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

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

如果你的正則表達式很簡單,為什么不只是有一個循環來進行字符串比較:

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

然后你不必擔心瀏覽器的限制,結果它可能會表現得更好(因為正則表達式版本必須解析並編譯正則表達式,所以有足夠的后向跟蹤,等等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM