2010-09-10 2 views
5

Каков максимальный размер регулярного выражения в современных браузерах (т. Е. Firefox 3+, Safari 4+, IE 7+)? Предположим, что простое регулярное выражение, например, «foo | bar | baz | woot | ...»Максимальный размер/длина регулярного выражения в "современных" браузерах?

+8

Если вам нужно спросить, вы делаете это неправильно ... –

+2

@ Андрей или, может быть, он делает свою магистерскую диссертацию по эзотерическим ограничениям браузера. – treeface

+2

Или мне естественно любопытно. – Tyson

ответ

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 бита), я получаю ошибку, когда я попытался регулярное выражение с 9М символов (9,999,990 символов) 3.204.161 символов. С 3.204.160 все в порядке.

В Chrome 5.0.3 предел - это что-то между символами 20M и 25M.

Ошибка в Firefox, является:

script stack space quota is exhausted 

Примечание: Если вы сделали какой-то тест, пожалуйста, комментарии здесь.

+3

Многие дистрибутивы ограничивают пространство стека до 10 МБ, так что это, вероятно, то, что вы нажимаете. – Chris

+0

@ Крис благодарит за ваш комментарий, но вершина около 3M символов ... Я пытаюсь получить точное число. – Topera

+0

Похоже, что для всех практических целей размер RegEx практически неограничен. Теперь я собираюсь спуститься по кроличьей норе, чтобы определить производительность абсурдно больших регулярных выражений. :) – Tyson

-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

2

Некоторые регулярные выражения требуют экспоненциального объема памяти для оценки. Поскольку Firefox делает это в стеке, ограниченном 10 МБ во многих дистрибутивах Linux, и даже меньше в Windows (по крайней мере, в некоторых версиях Firefox), вы можете достичь предела довольно быстро, если используете регулярное выражение, которое требует экспоненциальной памяти для преобразования в форму DFA для оценки.

Смежные вопросы