2011-01-19 22 views
48

Có công cụ nào có biểu thức chính quy cụ thể và trả về trường hợp xấu nhất về số lượng hoạt động cần thiết cho một số ký tự nhất định không?Phân tích trường hợp xấu nhất cho biểu thức chính quy

Vì vậy, ví dụ: được đưa ra (f|a)oo.*[ ]baz, số bước mà động cơ có thể đi qua để khớp với 100 ký tự?

Tôi cũng sẽ quan tâm nếu có một công cụ có thể lấy một loạt các mẫu văn bản và hiển thị các hoạt động trung bình cho mỗi lần chạy.

Tôi nhận thấy điều này phụ thuộc rất nhiều vào công cụ được sử dụng và triển khai - nhưng tôi không biết gì về mức độ phổ biến của nó. Vì vậy, nếu nó là phổ biến cho nhiều ngôn ngữ (làm cho câu hỏi của tôi quá mơ hồ) Tôi sẽ đặc biệt quan tâm đến Perl và Python.

+0

Câu hỏi hay! Rõ ràng nó sẽ phụ thuộc vào regex. Nó nổi tiếng là các regex thuần túy (thậm chí giống như ví dụ '(x + x +) + y' được tham chiếu bên dưới) thừa nhận một automata máy trạng thái thuần túy thuần túy, nhưng các thư viện regex thông thường thực sự thực hiện những người có backtracking, phần lớn để hỗ trợ những thứ như ngữ cảnh. Một công cụ như bạn mô tả sẽ là tuyệt vời tại bắt http://en.wikipedia.org/wiki/Regular_expression_Denial_of_Service_-_ReDoS –

Trả lời

22

Regexbuddy's trình gỡ lỗi hiển thị số bước thực hiện để kết thúc trận đấu hoặc không kết hợp với một mẫu nhất định. Thông tin thêm về catastrophic backtrackingdebugging regular expressions.

catastrophic backtracking shown in RegexBuddy

PS: Nó không phải là miễn phí nhưng họ cung cấp một tiền lại đảm bảo 3 tháng.

+1

Tôi đã chơi với điều đó - Jeff đã là một fan hâm mộ của nó: http://www.codinghorror.com /blog/2004/07/my-buddy-regex.html. Nhưng tôi đã suy nghĩ nhiều hơn một chút về lập trình và hướng đến việc tối ưu hóa - nếu điều đó có ý nghĩa. –

11

Lưu ý rằng tùy thuộc vào công cụ . Trong khi lý thuyết regex dựa trên lý thuyết automata thẳng, hầu hết các động cơ không phải là bản dịch nghiêm ngặt của những lý thuyết đó. Vì lý do này, ví dụ, một số động cơ phải chịu thời gian theo cấp số nhân trong khi xử lý NFA nghiêm ngặt thì không.

7

Bạn có thể nhận được những gì bạn đang tìm kiếm một cái gì đó như sử dụng re.compile với re.DEBUG. Xem số excellent answer này từ Python Hidden Features Wiki cộng đồng để có giải thích sâu rộng.