2010-09-10 16 views

cevap

9

Bu kodu, IE8/firefox'ta firebug/Chrome ile test etmek için kullanabilirsiniz.

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

Hata oluştuğunda sınırı buldunuz.


basit bir 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 

I 9M karakter ile bir normal ifade çalıştığında hata iletisi (Ubuntu 32 bit) ateş 3.6.3 içinde

SONUÇLARI (9.999.990 karakter) 3.204.161 karakter. 3.204.160 ile tamam.

Chrome 5.0.3'te sınır, 20M ila 25M karakter arasında bir şeydir.

hata, içinde ateş vardır:

script stack space quota is exhausted 

Not: bazı test yaptım, burada yorum lütfen.

+3

Birçok dağıtım, yığın alanını 10 MB ile sınırlandırır; – Chris

+0

@Chris Yorumunuz için teşekkürler, ama en iyisi 3M karaktere yakın ... Tam sayıyı almaya çalışıyorum. – Topera

+0

Tüm pratik amaçlar için olduğu gibi, RegEx boyutu neredeyse sınırsızdır. Şimdi saçma sapan büyük düzenli ifadelerin performansını belirlemek için tavşan deliğinden aşağı ineceğim. :) – Tyson

-1

normal ifadeniz böyle basit, neden sadece dize karşılaştırmaları yapan bir döngü var:

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

tarayıcı sınırlamaları hakkında endişelenmenize gerek yoktur ve büyük olasılıkla fazla performans göstereceklerini Sonuç olarak daha iyi (normal ifade sürümü normal ifadeleri ayrıştırmak ve derlemek zorunda kalacaktı, çünkü geri izleme bol olurdu, vb.).

+0

Doğru, ama soruya cevap vermiyor. – Bergi

2

Bazı düzenli ifadeler değerlendirmek için üstel bellek miktarını gerektirir. Firefox, birçok Linux dağıtımında 10 MB ile sınırlı olan ve hatta Windows'da daha küçük olan (en azından Firefox'un bazı sürümleri) yığını üzerinde yaptığı için, üstel bellek gerektiren normal bir ifade kullanırsanız, bu sınırı oldukça hızlı bir şekilde vurabilirsiniz. değerlendirmek için DFA formuna dönüştürmek.

İlgili konular