Biểu thức thông thường không


36

Hỏi ngay cả một người có nền tảng về khoa học máy tính về biểu thức chính quy là gì và câu trả lời có thể vượt ra ngoài giới hạn của việc nằm trong tầm tay của một máy tự động trạng thái hữu hạn.

Ví dụ: biểu thức chính quy của người Viking

/^1?$|^(11+?)\1+$/

được tạo bởi Abigail cá tính Perlail (và một phần của bộ thử nghiệm của Perl từ năm 2002) mô tả một cỗ máy chỉ chấp nhận các số đơn nguyên tổng hợp, nhưng thực hiện 4.5 (b) trong phiên bản thứ ba của Peter Linz Giới thiệu về Ngôn ngữ chính thức và Automata có người đọc sử dụng các Bổ đề bơm để chứng minh rằng

L={an:n is not a prime number}

không phải là một ngôn ngữ thông thường.

Trong bối cảnh mà sự khác biệt là quan trọng, chúng ta nên gọi những biểu thức mạnh mẽ hơn là gì?

Câu trả lời:


46

Larry Wall đề xuất rằng chúng tôi sử dụng "biểu thức chính quy" cho chủ nghĩa hình thức mà Kleene đề xuất và "regex" cho các biểu thức cho các phần mở rộng được sử dụng rộng rãi. Đó là một quy ước khá rộng rãi theo sau. Nếu bạn muốn làm rõ rằng bạn đang nói về các biểu thức thông thường theo nghĩa ngôn ngữ chính thức, thường không khó để dịch sang nói các ngôn ngữ thông thường.

Sức mạnh của regexes đến từ việc quay lui và đã có công việc được thực hiện trên automata cho các ngôn ngữ thông thường với việc quay lại. Xem, đặc biệt, Becchi & Crowley, 2008, Mở rộng tự động hữu hạn để kết hợp hiệu quả các biểu thức chính quy tương thích Perl .


5
Tôi đồng ý, một cái gì đó như "Perl regex" ("POSIX regex", v.v.) so với "ngôn ngữ thông thường" phải đủ rõ ràng để ngăn chặn mọi khả năng giải thích sai.
Jukka Suomela

Regex Perl có nhiều tính năng bổ sung hơn là quay lại.
Revierpost

@reinierpost Đúng, nhưng tôi nghĩ rằng quay lui là quan trọng nhất theo quan điểm ngôn ngữ chính thức. Các biểu thức Perl có các tính năng như thực thi mã Perl tùy ý, nhưng tôi nghĩ các biểu thức chính nên được hiểu một cách lỏng lẻo như bao trùm các PCRE. PCRE chứa những điều kỳ quặc như mô hình đệ quy, nhưng đây là những nghệ thuật đen tối, đưa bạn ra ngoài phạm vi của các ngôn ngữ thông thường. Tôi có thể cập nhật câu trả lời của tôi để bao gồm những điều này, mặc dù.
Charles Stewart

18

Những biểu hiện này đã được Aho (Sổ tay khoa học máy tính lý thuyết, tập A, Chp. 5) và Campeanu, Salomaa, Yu ("Một nghiên cứu chính thức về biểu thức chính quy thực tế", Tạp chí quốc tế về nền tảng khoa học máy tính, 14: 1007 Gian1018, 2003), cũng như một số tài liệu tiếp theo.

Aho gọi các biểu thức mạnh mẽ hơn là "tua lại" (biểu thức chính quy với phản hồi), Campeanu et al. sử dụng "biểu thức chính quy mở rộng" cũng như "biểu thức chính quy thực tế". Dường như, "biểu thức chính quy mở rộng" là thuật ngữ được sử dụng phổ biến nhất trong các tài liệu gần đây.

Dựa trên thuật ngữ "biểu thức hợp lý" từ trường phái Pháp và xem xét thực tế rằng những biểu thức đó được sử dụng trong thế giới thực, bản thân tôi thích "biểu hiện thực".

Phụ lục: Một chương trong luận án tiến sĩ của tôi đề cập đến lớp ngôn ngữ chính thức này (bài báo tương ứng sẽ xuất hiện tại STACS 2011). Trong khi viết chương đó và bài báo, tôi đã thử nghiệm nhiều thuật ngữ khác nhau. Cuối cùng, tôi quyết định sử dụng các biểu thức chính quy mở rộng cho mô hình với các phản hồi và các biểu thức chính quy phù hợp cho các biểu thức chính quy đẹp và bình thường. Vì khá khó chịu khi thay đổi thuật ngữ trong một bài viết đã được viết hoàn toàn (hoặc chủ yếu), tôi nghĩ rằng một số người có thể quan tâm đến những trải nghiệm dẫn đến lựa chọn của tôi:

Đầu tiên, regextua lại không thực sự cuộn lưỡi, và sử dụng chúng nhiều lần trong quá trình toàn bộ bài viết thực sự mệt mỏi để viết và đọc, đặc biệt là khi sử dụng bất kỳ hình thức số nhiều nào có thể. Các biểu thức thông thường giống như PERL cũng khá khó sử dụng. Tất nhiên, tôi không phải là người bản ngữ, vì vậy YMMV.

Thứ hai, ngay khi người ta muốn nói về cả hai mô hình, thật thuận tiện khi sử dụng các thuật ngữ là một biến thể của biểu thức chính quy , vì điều này cho phép người ta nhấn mạnh sự tương đồng hoặc khác biệt khi cần thiết (ví dụ: "một biểu thức chính quy, có đúng hay không mở rộng "). Hơn nữa, điều này cho phép người ta dễ dàng nhấn mạnh trường hợp đặc biệt của "biểu thức chính quy mở rộng mà không có phản hồi", khi nói về các trường hợp đặc biệt trong cả lớp, thay vì so sánh các mô hình khác nhau.

Thứ ba, tôi thích sử dụng một thuật ngữ đã được sử dụng trong văn học hơn một thuật ngữ mới được đặt ra, điều này cho tôi sự lựa chọn giữa các biểu thức chính quy mở rộngcác biểu thức chính quy thực tế . Lựa chọn thứ hai ngụ ý (ít nhất là ngầm) rằng các biểu thức chính quy phù hợp bằng cách nào đó không thực tế, điều này cảm thấy khá kỳ lạ (đặc biệt là RE2 của Google không sử dụng backrefs và có vẻ khá thực tế).

Tất nhiên, lựa chọn này chỉ là "tối đa cục bộ cá nhân" của tôi và tùy thuộc vào nhu cầu của từng người, các lựa chọn khác có thể phù hợp hơn.


7
Thật không may, thuật ngữ biểu thức chính quy mở rộng đã được POSIX sử dụng, phân biệt giữa biểu thức chính quy cơ bản (BRE)biểu thức chính quy mở rộng (ERE) , cả hai đều là biểu thức chính mở rộng theo định nghĩa của bạn.
Jörg W Mittag

@ Jörg: Thực ra theo này không mở rộng cũng không cơ bản POSIX biểu thức thông thường là mạnh hơn so với biểu thức thông thường thông thường. Và BRE thuần túy (không phải GNU) dường như thực sự kém mạnh hơn các biểu thức thông thường (thiếu một toán tử thay thế).
sepp2k

Xem "Về các biểu thức thường xuyên mở rộng" của Carle và Narendran (2009) để biết thêm kết quả gần đây về "tua lại" này: Portal.acm.org/citation.cfm?id=1533235
Jakob

Các kết quả gần đây hơn về lớp ngôn ngữ này: "Về sự giao thoa giữa các ngôn ngữ regex với các ngôn ngữ thông thường" của Campeanu và Santean (TCS 410, 2009) "Một thử nghiệm đối sánh thời gian đa thức cho các lớp lớn biểu thức chính quy mở rộng" của Reidenbach và Schmid (CIAA 2010 ) và "Biểu thức thường xuyên mở rộng: Sự cô đọng và quyết đoán" (theo tôi, do xuất hiện tại STACS 2011).
Dominik D. Freydenberger

6

Người ta biết rằng cái gọi là regrec của perl đủ mạnh để hoàn thành Turing; thậm chí còn có một trình biên dịch từ chương trình thông thường đến perl regapi.

Do đó tôi nghi ngờ việc tìm kiếm một tên cho loại "regexps" này là hợp lý.

Tìm ví dụ tại http://search.cpan.org/~asavige/Acme-EyeDrops-1.62/lib/Acme/EyeDrops.pm


Bạn có một số gợi ý?
András Salamon

5
@ András: Tôi nghĩ Arthur đang nói về ?{CODE}chỉ thị của Perl , cho phép các biểu thức mẫu xen kẽ mã chương trình trong các biểu thức thông thường. Tôi hiểu rằng PCRE được định nghĩa một cách hữu dụng là phần "khai báo" của ngôn ngữ, toàn bộ ngôn ngữ được gọi là ngôn ngữ mẫu. Theo WP, 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. Không có tính năng cứng nào khác cho PCRE khai báo.
Charles Stewart

Tôi đã thêm liên kết; Tôi đã không nhìn vào mã nguồn, vì vậy tôi không thực sự biết nó hoạt động như thế nào và liệu có bằng chứng nào cho thấy việc biên dịch này thực sự chính xác hay không.
Arthur SỮA

1
Xin lỗi, nhưng theo lập luận của bạn, vì lambda-compus là Turing-Complete, việc tìm kiếm tên cho nó không có nghĩa gì. Tương tự cho tất cả các hình thức và ngôn ngữ tính toán hoàn chỉnh Turing khác. Quan trọng hơn, tính đầy đủ của Turing không mô tả mức độ biểu cảm của một ngôn ngữ, do đó, việc xác định các ngôn ngữ chỉ vì chúng là Turing hoàn chỉnh là vô nghĩa. Ví dụ của tôi về lambda-compus là một điều cực kỳ, tất nhiên.
Blaisorblade

2

Tôi nghĩ thuật ngữ tốt nhất cho "biểu thức chính quy trong ngữ cảnh của automata" là "biểu thức hợp lý", như được sử dụng, trong phần Các lý thuyết tự động của Sakarovitch, hoặc Sổ tay về tự động có trọng số.


1
Không được sử dụng rất phổ biến, IMHO.
Blaisorblade

Nó / được / sử dụng rộng rãi trong lý thuyết automata có trọng số, xem en.wikipedia.org/wiki/Rational_lingu . Tôi cũng đã thấy nó rất nhiều lần trong lĩnh vực ngôn ngữ qua các nhóm.
Michaël Cadilhac

1

Đưa ra các câu trả lời khác, tôi sẽ đề xuất rằng "ngôn ngữ thông thường" là an toàn và sau khi nhận xét ngắn gọn về sự khác biệt, để nói về "biểu thức chính quy thực tế" cho biểu thức chính quy (với quay lui).

Cũng lưu ý rằng cùng một biểu thức chính quy, như một biểu thức chính quy và như một biểu thức thực tế, có thể có các ngữ nghĩa khác nhau, bởi vì trong trường hợp sau, ngữ nghĩa được xác định theo thuật ngữ quay lui, với các kết quả khác nhau. Chi tiết sẽ lạc đề, nhưng tôi sẽ trả lời nếu bạn hỏi một câu hỏi khác về vấn đề đó (có thể trên SO chứ không phải ở đây, dunno) và thông báo cho tôi qua một bình luận.


0

Chúng ta có thể gọi chúng là biểu thức mẫu . Điều này có thể giới thiệu sự nhầm lẫn với các ngôn ngữ mẫu, nhưng ít nhất những điều này ít phổ biến hơn.


2
Về nguyên tắc, tôi đồng ý với lý luận của bạn, nhưng Campeanu, Santean và Yu đã sử dụng các biểu thức mẫu thuật ngữ để biểu thị một loại ngôn ngữ tương tự với định nghĩa "sạch hơn" (xem "Biểu thức mẫu và tự động mẫu", IPL 92 (2004 ).
Dominik D. Freydenberger
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.