【问题标题】:Maximum size/length of regular expression in "modern" web browsers?“现代”网络浏览器中正则表达式的最大大小/长度?
【发布时间】:2013-04-22 18:50:42
【问题描述】:

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

【问题讨论】:

  • 如果你非要问,那你就错了……
  • @Andrew 或者他正在做关于深奥的浏览器限制的硕士论文。

标签: javascript regex


【解决方案1】:

您可以使用此代码进行测试,在 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

注意:如果你做了一些测试,请在这里评论。

【讨论】:

  • 许多发行版将堆栈空间限制为 10 MB,所以这可能就是您想要的。
  • @Chris 感谢您的评论,但顶部接近 3M 字符...我正在尝试获取确切的数字。
  • 听起来,就所有实际目的而言,RegEx 的大小实际上是无限的。现在我要深入研究确定大得离谱的正则表达式的性能的兔子洞。 :)
【解决方案2】:

某些正则表达式需要指数级的内存来计算。由于 Firefox 在堆栈上执行此操作,在许多 Linux 发行版上限制为 10 MB,在 Windows 中甚至更小(至少 Firefox 的某些版本),如果您使用需要指数内存的正则表达式,您可以很快达到限制转换为 DFA 形式进行评估。

【讨论】:

    【解决方案3】:

    如果你的正则表达式就这么简单,为什么不使用一个循环来进行字符串比较:

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

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

    【讨论】:

    • 是的,但它没有回答问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多