Có thể viết một Regex cần trong một số trường hợp thời gian chạy theo hàm mũ. Ví dụ như vậy là (aa|aa)*
. Nếu có một đầu vào của một số lẻ của a
s nó cần thời gian chạy theo cấp số nhân.Tại sao cụm từ thông dụng có thể có thời gian chạy theo hàm mũ?
Thật dễ dàng để kiểm tra điều này. Nếu đầu vào chỉ chứa a
s và có chiều dài 51, Regex cần vài giây để tính toán (trên máy của tôi). Thay vào đó, nếu độ dài đầu vào là 52 thì thời gian tính toán của nó không đáng chú ý (tôi đã thử nghiệm điều này bằng trình phân tích cú pháp-Regex của JavaRE).
Tôi đã viết bộ phân tích cú pháp Regex để tìm lý do cho hành vi này, nhưng tôi không tìm thấy nó. Trình phân tích cú pháp của tôi có thể tạo một số AST hoặc NFA dựa trên Regex. Sau đó, nó có thể dịch NFA thành DFA. Để làm điều này, nó sử dụng powerset construction algorithm.
Khi tôi phân tích cú pháp Rgex được đề cập ở trên, trình phân tích cú pháp tạo NFA với 7 trạng thái - sau khi chuyển đổi chỉ còn lại 3 trạng thái trong DFA. DFA đại diện cho Regex (aa)*
hợp lý hơn, có thể được phân tích cú pháp rất nhanh.
Vì vậy, tôi không hiểu tại sao có các trình phân tích cú pháp có thể quá chậm. Lý do cho điều này là gì? Họ không dịch NFA sang DFA? Nếu có, tại sao không? Và lý do kỹ thuật tại sao chúng tính toán chậm như vậy?
http://stackoverflow.com/questions/844183/python-regular-expression-implementation-details Có vẻ như có một số cuộc thảo luận trong quá khứ – lucemia