Trường hợp nào hầu hết các triển khai REGEX rơi vào quy mô phức tạp?


19

Hầu hết các triển khai hiện đại của các biểu thức chính quy, chẳng hạn như các biểu thức trong perl hoặc .NET, vượt xa định nghĩa khoa học máy tính cổ điển của REGEXes với các tính năng như lookahead và lookbehind. Các tính năng này có cho phép chúng phân tích các câu lệnh không thể được mô tả bằng một máy tự động hữu hạn, không đẩy xuống không? Làm thế nào gần hơn với turing hoàn thành điều này làm cho họ nếu họ có thể?


2
Một câu hỏi liên quan chặt chẽ: Chúng ta có điều gì thú vị giữa "regexes with backreferences" và "regexes có thể chứa mã chương trình tùy ý" không? Ví dụ, các biểu thức có biểu thức phản hồi và biểu tượng / giao diện có tính biểu cảm nghiêm ngặt hơn biểu thức chính xác với biểu thức phản hồi nhưng không có giao diện / giao diện? Thế còn "Động từ điều khiển quay lui đặc biệt" trong Perl thì sao?
Jukka Suomela

Liên quan (và có thể không chính xác): stackoverflow.com/questions/2974210/ từ
Aryabhata

Câu trả lời:


18

Tôi không nghĩ rằng vấn đề thực sự là câu hỏi về ý nghĩa không giới hạn; điều này không tệ hơn bất kỳ tình huống nào khác trong phân tích cú pháp.

Vấn đề nằm ở việc mô tả các phản hồi, cả hai đều rất mạnh và rất hạn chế: chúng cho phép mô tả một số ngôn ngữ không ngữ cảnh, mà không cho phép một số ngôn ngữ không ngữ cảnh. Ví dụ: regex (a*)b\1b\1khớp với các chuỗi có dạng và bạn có thể sử dụng bổ đề bơm để hiển thị đây không phải là ngôn ngữ không ngữ cảnh. Tuy nhiên, mặt khác, các biểu thức chính với các phản hồi dường như không đủ để khớp với ngôn ngữ ngoặc đơn cân bằng, đó là ngôn ngữ không có ngữ cảnh nguyên mẫu.anbanban

Thật dễ dàng để đưa ra một ngữ nghĩa học biểu thị cho biết chuỗi nào trong ngôn ngữ đối với các biểu thức, nhưng việc đưa ra một đặc tính lý thuyết tự động tốt có vẻ khó khăn hơn nhiều. Nó giống như một máy đăng ký, vào các thanh ghi mà bạn có thể sao chép các chuỗi con của đầu vào và bạn có thể sử dụng để kiểm tra chuỗi hiện tại của mình, nhưng bạn không có khả năng sửa đổi các thanh ghi này.

Những người thực hiện lý thuyết mô hình hữu hạn có một loạt các mô hình máy thú vị, và sẽ rất thú vị nếu biết điều này có tương ứng với bất kỳ mô hình nào của họ không.


9

Vấn đề với việc trả lời câu hỏi này là nắm bắt khái niệm "không giới hạn" trong một triển khai thực tế. Ví dụ: regex /(.*)\1/sẽ nắm bắt ngôn ngữ , không có ngữ cảnh. Trên thực tế có thể có giới hạn trên stack sử dụng (ví dụ: có lẽ vị không thể lâu hơn một số lượng lớn ), mà hiệu quả sẽ biến ngôn ngữ vào , với bất kỳ cố định nào lại là biểu thức chính quy.w K L K = { w w | w Σ * , | w | K } KL={ww|wΣ}wKLK={ww|wΣ,w∣≤K}K

Nhưng về nguyên tắc, regexps như được chỉ định mạnh hơn các ngôn ngữ thông thường, vì câu hỏi liên quan này thảo luận chi tiết hơn nhiều (với một ví dụ tiện lợi là tốt).


Sẽ không {ww | w ∈ Σ, w∣≤K} sẽ là một CSL hoặc TM có thể nhận ra ??
dhruvbird

lập luận nên đã làm ww ^ R. sẽ sửa chữa. cảm ơn
Suresh Venkat

Trên thực tế, tôi đã có một câu hỏi về điều này. Là một CSL hoặc là turing nhận ra? Tôi chưa (chưa) có thể đưa ra một LBA cho nó, vì vậy chỉ cần tự hỏi ...
dhruvbird

1
Nếu độ dài không bị giới hạn, ngôn ngữ sao chép là phân biệt ngữ cảnh. (Nó thậm chí còn "nhạy cảm với ngữ cảnh", đó là một khái niệm gần đây đã đạt được tầm quan trọng trong Xử lý ngôn ngữ tự nhiên.) Một ngữ pháp nhạy cảm theo ngữ cảnh (và do đó, một LBA) không dễ tìm, nhưng có thể tìm thấy trong nhiều sách giáo khoa và tài liệu giảng dạy trên web (sử dụng bất kỳ công cụ tìm kiếm nào cho "sao chép ngôn ngữ nhạy cảm"). {ww:wΣ}
DaniCL

5

Một kết quả thú vị, được lấy từ câu hỏi khác này , cũng được liên kết bởi Suresh Venkat, đó là các biểu thức "Thực tế" đã hoàn thành NP, và do đó chúng phải có sức mạnh tương đương với SAT.

Là một người không phải là chuyên gia, trong khi tôi đồng ý rằng "trực giác với các phản hồi có vẻ không đủ để phù hợp với ngôn ngữ ngoặc đơn cân bằng", có một điều kỳ lạ đang diễn ra. Tính đầy đủ của NP ngụ ý rằng bất kỳ vấn đề NP nào cũng có thể được giảm một cách đa thức thành một biểu thức chính quy, do đó, có lẽ chỉ có một phép giảm đa thức từ ngôn ngữ "dấu ngoặc đơn cân bằng" thành một biểu thức có thể nhận ra bằng biểu thức chính quy. Nhưng một lần nữa, có thể có một số regrec ngớ ngẩn để phân tích CFL, vì họ thậm chí có thể phân tích các số đơn nguyên không chính thức!

Có lẽ, bài học là các lớp phức tạp và các lớp ngôn ngữ không thể so sánh được, nói chung. Điều này cũng gợi ý việc chia sẻ lại câu hỏi của bạn, để tham khảo hệ thống phân cấp Chomsky thay vì "thang độ phức tạp" (ngay cả khi, công bằng mà nói, tôi không bị nhầm lẫn bởi điều đó).

Charles Stewart viết:

Aho, 1990, "Thuật toán tìm mẫu trong chuỗi" cho thấy vấn đề thành viên đối với các ngôn ngữ thông thường với quay lui là NP hoàn tất.

Có thể tìm thấy bản xem trước một phần (ít nhất là bản tuyên bố) trên Google Sách , ở trang 288 và có thể tìm thấy tài liệu tham khảo về thư mục ở đây . Lưu ý rằng trong bài báo, tua lại là viết tắt của Biểu thức chính quy với BackReferences.


3

PCRE, triển khai phổ biến nhất của "biểu thức chính quy" cũng thực hiện các mẫu đệ quy, vượt ra ngoài các phản hồi. Một câu hỏi về sự phức tạp của chúng vừa được hỏi tại Stackoverflow. Theo câu trả lời thực tế của Perl guru brian d foy, điều này làm cho PCRE mạnh mẽ như các ngữ pháp không ngữ cảnh. Tuy nhiên, cú pháp là khủng khiếp so với Backus-Naur Form.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.