2010-09-10 34 views
5

Kích thước tối đa của cụm từ thông dụng trong các trình duyệt hiện đại (tức là Firefox 3+, Safari 4+, IE 7+) là gì? Giả sử một biểu thức thông thường đơn giản, trong số, nói "foo | bar | baz | woot | ..."Kích thước/độ dài biểu thức chính quy tối đa trong trình duyệt web "hiện đại"?

+8

Nếu bạn phải hỏi, bạn đang làm sai ... –

+2

@Andrew Hoặc có thể anh ấy đang làm luận văn thạc sĩ về giới hạn trình duyệt bí truyền. – treeface

+2

Hoặc tôi tự nhiên tò mò. – Tyson

Trả lời

9

Bạn có thể sử dụng mã này để kiểm tra, trong IE8/firefox bằng 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)); 
    } 
} 

Khi bạn gặp lỗi, bạn đã tìm thấy giới hạn.


SIMPLE THI

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 

KẾT QUẢ

Trong Firefox 3.6.3 (Ubuntu 32 bit) tôi nhận được báo lỗi khi tôi đã cố gắng một regex với chars 9M (9.999.990 ký tự) 3.204.161 ký tự. Với 3,204.160 nó là ok.

Trong Chrome 5.0.3 giới hạn là khoảng từ 20 triệu đến 25 triệu ký tự.

Lỗi, trong firefox, là:

script stack space quota is exhausted 

Lưu ý: Nếu bạn đã làm một số kiểm tra, hãy bình luận ở đây.

+3

Nhiều bản phân phối giới hạn không gian ngăn xếp đến 10 MB, vì vậy đó có thể là những gì bạn đang đánh. – Chris

+0

@ Chris cảm ơn nhận xét của bạn, nhưng phần trên gần 3M ký tự ... Tôi đang cố gắng lấy số chính xác. – Topera

+0

Nghe có vẻ như cho tất cả các mục đích thực tế, kích thước RegEx là thực tế không giới hạn. Bây giờ tôi sẽ đi xuống hố thỏ để xác định hiệu suất của các biểu thức chính quy lớn vô lý. :) – Tyson

-1

Nếu biểu thức chính quy bạn là đơn giản như vậy, tại sao không chỉ có một vòng lặp mà không so sánh chuỗi:

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

Sau đó, bạn không cần phải lo lắng về những hạn chế của trình duyệt, và nó sẽ hoạt động nhiều tốt hơn như là một kết quả (kể từ khi phiên bản biểu thức chính quy sẽ phải phân tích cú pháp và biên dịch regex, sẽ có rất nhiều theo dõi trở lại, và như vậy).

+0

Đúng, nhưng nó không trả lời câu hỏi. – Bergi

2

Cụm từ thông dụng nhất định yêu cầu số lượng bộ nhớ để đánh giá. Vì Firefox thực hiện điều này trên stack, giới hạn 10 MB trên nhiều bản phân phối Linux và thậm chí nhỏ hơn trong Windows (ít nhất là một số phiên bản Firefox), bạn có thể đạt đến giới hạn khá nhanh nếu bạn sử dụng cụm từ thông dụng yêu cầu bộ nhớ theo cấp số nhân để chuyển đổi thành biểu mẫu DFA để đánh giá.

Các vấn đề liên quan