"现代"网页浏览器中正则表达式的最大大小/长度是多少?

5
现代浏览器(如Firefox 3+,Safari 4+,IE 7+)中正则表达式的最大大小是多少?假设这是一个简单的正则表达式,例如“foo | bar | baz | woot | ...”。

8
如果你需要问,那么你肯定做错了什么... - Andrew Moore
2
@Andrew 或许他正在撰写关于奇怪的浏览器限制的硕士论文。 - treeface
3个回答

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

当你遇到错误时,说明你已经达到了极限。


简单测试

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位)中,当我尝试使用正则表达式匹配3,204,161个字符时,出现错误。如果是3,204,160个字符则没有问题。

在Chrome 5.0.3中,限制在20M到25M个字符之间。

在Firefox中出现的错误信息为:

script stack space quota is exhausted

注意:如果您进行了一些测试,请在此处发表评论。

3
许多发行版将堆栈空间限制为10 MB,所以这可能是你遇到的问题。 - Chris
@Chris 谢谢你的评论,但是顶部接近 3M 字符...我正在尝试获取确切的数字。 - Topera
听起来实际上,正则表达式的大小几乎是无限的。现在我要深入研究极大正则表达式的性能了。 :) - Tyson

2
某些正则表达式需要指数级的内存才能进行评估。由于Firefox在堆栈上执行这个操作,而Linux发行版上的堆栈限制为10 MB,在Windows中甚至更小(至少某些版本的Firefox),如果你使用需要指数级内存才能转换为DFA形式进行评估的正则表达式,你很快就会遇到这个限制。

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

那么你就不必担心浏览器的限制,结果很可能会表现得更好(因为正则表达式版本需要解析和编译正则表达式,有大量的回溯等)。


正确,但它并没有回答问题。 - Bergi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接