Vấn đề này được gọi là "bao gồm" hoặc "subsumption" của biểu thức chính quy, vì những gì bạn đang yêu cầu, là liệu tập hợp các từ phù hợp với một regexp bao gồm (hoặc subsumes) tập hợp các từ phù hợp với regex khác . Bình đẳng là một câu hỏi khác thường thường có nghĩa là hai regexps có khớp chính xác với cùng một từ hay không, tức là chúng tương đương về mặt chức năng. Ví dụ "a *" bao gồm "aa *", trong khi chúng không bằng nhau.
Tất cả các thuật toán đã biết để bao gồm regexp là trường hợp xấu nhất mất thời gian theo cấp số mũ trong kích thước của regexp.Tuy nhiên, thuật toán tiêu chuẩn là như thế này:
Input r1 và r2 Output Yes nếu r1 bao gồm r2
- Tạo DFA (r1) và DFA (r2)
- Tạo Neg (DFA (r1)) (khớp chính xác với những từ r1 không khớp)
- Tạo Neg (DFA (r1)) x DFA (r2) (khớp chính xác với những từ khớp với Neg (DFA (r1)) và DFA (r2))
- Kiểm tra xem automaton được tạo trong 3. không khớp với bất kỳ từ nào
Tác phẩm này, vì những gì bạn đang kiểm tra là không có từ nào khớp với r2 không khớp với r1.
@skaffman: Tôi nghĩ rằng thẻ ngôn ngữ thông thường phù hợp với điều kiện một regex mô tả một ngôn ngữ thông thường - đó chỉ là một cách đơn giản để biểu thị nó "trên giấy". Nhưng câu hỏi là w.r.t. khoa học máy tính có nhiều việc phải làm với các ngôn ngữ thông thường hơn là các biểu thức thông thường. –
eh, tiêu đề không khớp với mô tả? – maxschlepzig
Tôi không chắc chắn nếu đủ điều kiện như là một "thuật toán", nhưng bằng cách sử dụng ". *" Phù hợp với đầu vào tùy ý với một biểu thức chính quy; Tôi nghi ngờ nó có thể được giảm thiểu đến ít hơn 1. :-) –