Xây dựng một động cơ regex theo phương pháp kinh điển: dựng NFA theo thuật toán Thompson từ biểu thức chính quy, rồi mô phỏng NFA đó (bằng ε-closure) để kiểm tra khớp mẫu.
Xét văn phạm biểu thức chính quy trên bảng chữ cái gồm các chữ cái tiếng Anh thường, với các phép toán theo thứ tự ưu tiên tăng dần: hợp | (union) có độ ưu tiên thấp nhất, tiếp theo là nối tiếp (concatenation, được viết ngầm định giữa hai thành phần liền nhau, không có ký hiệu riêng), và lặp Kleene * (star) có độ ưu tiên cao nhất; dấu ngoặc đơn ( ) dùng để nhóm và ghi đè thứ tự ưu tiên mặc định. Một nhánh của phép hợp | được phép rỗng, biểu diễn xâu rỗng ε — ví dụ mẫu a| khớp a hoặc khớp xâu rỗng.
Cho biểu thức chính quy p (đảm bảo hợp lệ theo văn phạm trên) và một xâu s gồm chữ cái thường, hãy xác định p có khớp toàn bộ (full match, từ đầu tới cuối) xâu s hay không.
Ví dụ: p= (a|b)*abb, s= ababababb → khớp, vì s có thể viết thành (ab)3⋅abb... tổng quát hơn: s là một dãy tuỳ ý các ký tự a,b và kết thúc bằng abb.
Dòng 1 chứa biểu thức chính quy p (0≤∣p∣≤300; có thể là dòng rỗng, tương ứng biểu thức chỉ khớp xâu rỗng). Dòng 2 chứa xâu s (0≤∣s∣≤300, chỉ gồm chữ cái thường; có thể là dòng rỗng).
In YES nếu p khớp toàn bộ s, ngược lại in NO.
Ví dụ:
Đầu vào:
a*b
b
Đầu ra:
YES
Đầu vào:
a*b
aaab
Đầu ra:
YES
Đang tải editor...