2010-09-10 11 views
5

Jaki jest maksymalny rozmiar wyrażenia regularnego w nowoczesnych przeglądarkach (np. Firefox 3+, Safari 4+, IE 7+)? Załóżmy proste wyrażenie regularne, powiedzmy "foo | bar | baz | woot | ..."Maksymalny rozmiar/długość wyrażenia regularnego w "nowoczesnych" przeglądarkach internetowych?

+8

Jeśli musisz zapytać, robisz to źle ... –

+2

@Andrew A może on robi swoją pracę magisterską na temat ezoterycznych ograniczeń przeglądarki. – treeface

+2

Albo jestem z natury ciekawy. – Tyson

Odpowiedz

9

Możesz użyć tego kodu do przetestowania, w IE8/firefox za pomocą firebuga/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)); 
    } 
} 

Gdy pojawi się błąd, ustalono limit.


prosty 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 

WYNIKI

W Firefoksie 3.6.3 (Ubuntu 32 bity) otrzymuję błąd, gdy próbowałem regex z 9M znaków (9.999.990 znaków) 3.204.161 znaków. W wersji 3.204.160 wszystko jest w porządku.

W przeglądarce Chrome 5.0.3 limit wynosi od 20 do 25 znaków.

Błąd w Firefoksie, to:

script stack space quota is exhausted 

Uwaga: Jeśli zrobiłeś jakiś test, prosimy o komentarz tutaj.

+3

Wiele dystrybucji ogranicza przestrzeń stosu do 10 MB, więc prawdopodobnie to właśnie trafiasz. – Chris

+0

@Chris dzięki za komentarz, ale na górze jest blisko 3M znaków ... Próbuję uzyskać dokładną liczbę. – Topera

+0

Brzmi jak ze wszystkich praktycznych zastosowań, rozmiar RegEx jest praktycznie nieograniczony. Teraz zamierzam przejść przez króliczą dziurę określania wydajności absurdalnie dużych wyrażeń regularnych. :) – Tyson

-1

Jeśli wyrażenie regularne jest prosta tak, dlaczego nie wystarczy mieć pętlę, która robi porównań ciąg znaków:

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

Wtedy nie trzeba się martwić o ograniczenia przeglądarek, i będzie to prawdopodobnie wykonać znacznie w związku z tym lepiej (ponieważ wersja wyrażeń regularnych musiałaby analizować i kompilować wyrażenie regularne, byłoby dużo śledzenia wstecznego itd.).

+0

To prawda, ale nie odpowiada na pytanie. – Bergi

2

Niektóre wyrażenia regularne wymagają wykładniczej ilości pamięci do oceny. Ponieważ Firefox robi to na stosie, który jest ograniczony do 10 MB na wielu dystrybucjach Linuksa, a nawet mniejszy w systemie Windows (przynajmniej niektóre wersje Firefoksa), możesz dość szybko osiągnąć limit, jeśli użyjesz wyrażenia regularnego wymagającego pamięci wykładniczej przekonwertować formularz DFA do oceny.

Powiązane problemy