繁体   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