Định nghĩa của một biểu thức chính quy là gì?


10

Gần đây tôi đã có một cuộc tranh luận thân thiện với Ghoti về những gì tạo thành một biểu thức chính quy trong các bình luận cho câu trả lời của tôi cho câu hỏi này . Tôi tuyên bố rằng sau đây là một biểu thức chính quy:

`[Rr]eading[Tt]est[Dd]ata`

Ghoti không đồng ý, thay vào đó tuyên bố nó là một tập tin toàn cầu. Các glob trang trên tuyên bố wikipedia đó (tôi nhấn mạnh):

Globs không bao gồm cú pháp cho ngôi sao Kleene, cho phép lặp lại nhiều phần của biểu thức trước; do đó chúng không được coi là biểu thức chính quy, có thể mô tả một tập hợp lớn hơn các ngôn ngữ thông thường trên bất kỳ bảng chữ cái hữu hạn nào.

Tuy nhiên, không có trích dẫn nào cho tuyên bố này, chỉ ra rằng đó chỉ là ý kiến ​​của một biên tập viên wikipedia cụ thể.

Các Single UNIX ® Thông số kỹ thuật, phiên bản 2 , các quốc gia mà một Regular Expression cơ bản (BRE) thậm chí có thể là một nhân vật duy nhất:

Một ký tự bình thường là một BRE khớp với chính nó: bất kỳ ký tự nào trong bộ ký tự được hỗ trợ, ngoại trừ các ký tự đặc biệt BRE được liệt kê trong các ký tự đặc biệt BRE.

Vậy, định nghĩa của biểu thức chính quy trong thế giới * nix là gì và định nghĩa đó có loại trừ các tập tin không?


6
Trong CS lý thuyết, một biểu thức chính quy là một mô tả của một ngôn ngữ thông thường, một ngôn ngữ có thể được nhận ra bởi một máy tự động hữu hạn. Trong thế giới Unix, nó phức tạp hơn nhiều và không có định nghĩa duy nhất. Có 2 phương ngữ regex trong POSIX spec: mở rộng và cơ bản, được sử dụng bởi các công cụ thích grep, sedawk. Vim sử dụng sự đa dạng của riêng mình, cũng như Perl.
jw013

Vì vậy, theo định nghĩa đó, một tập tin toàn cầu một BRE phải không?
terdon

2
Không, một tập tin toàn cầu KHÔNG phải là BRE - điều gì khiến bạn nghĩ nó là? Nếu bạn đọc mô tả POSIX của BRE và mô tả POSIX về hình cầu, bạn sẽ nhận thấy rằng chúng không giống nhau. Ví dụ, *có hai ý nghĩa khác nhau trong BRE và globs. Lưu ý: Tôi không nghĩ thuật ngữ toàn cầu được sử dụng ở bất kỳ đâu trong thông số POSIX - thay vào đó, nó được gọi là Kết hợp mẫu và được mô tả trong chương ngôn ngữ hệ vỏ.
jw013

Câu trả lời:


10

Như lk- nói, các -nametùy chọn findsẽ đối xử với lập luận như một glob, không phải là một biểu thức chính quy.

Việc một chuỗi được hiểu là toàn cầu hay regex hay chỉ là một chuỗi đơn giản phụ thuộc vào những gì đang được sử dụng để thực hiện phiên dịch. Đó là một vấn đề bối cảnh. Chuỗi trong ví dụ của bạn, [Rr]eading[Tt]est[Dd]atacó thể được đánh giá theo một số cách khác nhau, nhưng chuỗi này phụ thuộc vào cách bạn đang sử dụng nó. Sử dụng nó như một quả địa cầu, nó là một quả địa cầu. Sử dụng nó như một regex, đó là một regex. Trong trường hợp câu hỏi này bắt nguồn từ đâu , OP đã mô tả chuỗi là regex. Vì vậy, chúng ta có thể giả định rằng anh ta dự định diễn giải nó như một biểu thức chính quy.

Một nhân vật duy nhất cũng có thể là một regex, hoàn toàn. Nó cũng có thể là một chuỗi, và nó cũng có thể là một quả địa cầu. Nó có thể được hiểu là một byte hoặc tinyint, nếu bạn muốn. Tất cả phụ thuộc vào bối cảnh.

Có một số thông số kỹ thuật cho các biểu thức thông thường trong các hình thức khác nhau. BRE và ERE được ghi chép lại. PCRE thêm các chức năng. Nhiều thông dịch viên regex sẽ triển khai, ví dụ: "tất cả ERE và một số PCRE". Hoặc họ sẽ làm ERE trừ một số tính năng. Nếu bạn đi theo thông số kỹ thuật chính thức, nhiều công cụ yêu cầu hỗ trợ regex hóa ra không chính xác hoặc không đầy đủ. Biết các chi tiết cho phép bạn điều chỉnh các giải pháp của mình cho bộ sưu tập các chức năng có sẵn trong bất kỳ công cụ nào đang đánh giá regex của bạn.

Vì vậy, ... nếu bạn đang tìm kiếm các định nghĩa "loại trừ" các khối, bạn đang xem xét điều này từ quan điểm sai. Những gì nó được xác định bởi cách bạn sử dụng nó .


7

[Rr]eading[Tt]est[Dd]atadường như có giá trị như cả một biểu thức toàn cầu và biểu thức chính quy và tôi tin rằng có cùng "ý nghĩa" trong cả hai cách hiểu. Tuy nhiên, -nametùy chọn findsẽ coi đối số là một khối, không phải là biểu thức chính quy.

Sự khác biệt này sẽ có vấn đề nếu bạn cung cấp một đối số, chẳng hạn như foo*cả một thế giới hợp lệ và một biểu thức chính quy hợp lệ, nhưng có ý nghĩa khác nhau tùy thuộc vào cách hiểu:

Nếu hiểu như là một mô hình glob, điều này sẽ phù hợp với foo, foobar, foo123vv

Nếu hiểu như là một biểu hiện thường xuyên, điều này sẽ phù hợp với fo, foo, foooooovv


Cảm ơn, tôi thấy sự khác biệt giữa mô hình toàn cầu và biểu thức chính quy. Định nghĩa chính thức của regex là gì?
terdon

1
Tôi không biết nếu có một định nghĩa duy nhất cho "biểu thức chính quy" vì thuật ngữ này thường được sử dụng. Có các đặc tả cú pháp khác nhau, chẳng hạn như biểu thức chính quy POSIX hoặc biểu thức chính quy Perl, bao gồm các "tính năng" khác như phản hồi hoặc tìm kiếm. Đây có thể không còn là biểu thức chính quy theo nghĩa chặt chẽ nhất (trong ngữ cảnh của các ngôn ngữ chính thức thông thường) nhưng vẫn được gọi là như vậy.
lk-
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.