Khi nào biểu thức chính quy không phải là Biểu thức chính quy?


9

Vì tôi đang học khóa học ngôn ngữ chính thức của mình, tôi tình cờ thấy những bài viết hấp dẫn này ( Một Hai ) mô tả cách tìm số nguyên tố bằng cách sử dụng biểu thức chính quy . Như tôi đã nói, một biểu thức chính quy , không phải là biểu thức chính quy . Do một biểu thức chính quy có thể khớp với các chuỗi được tính toán bởi một trạng thái tự động hữu hạn và việc tìm kiếm một số nguyên tố không thể được thực hiện bởi một FSA, nên biểu thức chính quy được hiển thị trong bài đăng trên blog không hoàn toàn là một biểu thức thông thường vì nó quay lại để khớp với chuỗi.

Vì tôi chưa bao giờ thực sự sử dụng bất kỳ biểu thức chính quy nào, nên bây giờ, câu hỏi của tôi:

Làm thế nào tôi có thể nhận ra ngay một biểu thức chính quy từ biểu thức chính quy "thật" chỉ bằng cách nhìn vào nó?

Định nghĩa: Bằng cách diễn đạt thông thường, tôi đề cập đến khái niệm như được định nghĩa trong các ngôn ngữ chính thức. Theo regrec, ý tôi là khái niệm được hỗ trợ bởi các ngôn ngữ lập trình hiện đại; cú pháp regrec thường chứa các tính năng bổ sung, chẳng hạn như phản hồi. Regexps như đã thấy trong các ngôn ngữ lập trình mạnh hơn nhiều so với các ngôn ngữ chính thức theo kiểu biểu thức thông thường.


5
Regapi chỉ là viết tắt của biểu thức thông thường. Việc tính toán số nguyên tố dựa trên hack Perl, không dựa trên các biểu thức thông thường.

1
Nó khá đơn giản. Ngôn ngữ thông thường sử dụng nối, lặp lại và xen kẽ. Bất cứ khi nào một động cơ hỗ trợ một cái gì đó không tương đương với những thứ này, nó không thường xuyên.
Kilian Foth

1
Câu hỏi liên quan: 1 , 2 , 3 .
Raphael

@Yannis Nếu bạn nhảy qua hàng rào để CS, điều đó không còn đúng nữa. Các quy tắc như đã thấy trong các ngôn ngữ lập trình mạnh hơn nhiều so với các biểu thức thông thường (kiểu ngôn ngữ chính thức) và dạng "regrec" ngắn là theo quy ước (tôi không biết nó được sử dụng rộng rãi như thế nào) trước đây, chứ không phải sau này. Tốt bụng.
Raphael

@KilianFoth Đó thực sự không phải là một mô tả hữu ích. Ví dụ: bạn có thể thêm phủ định (hoặc, thực sự, bất kỳ tập hợp hữu hạn nào của các kết nối Boolean) vào các biểu thức thông thường mà không làm tăng sức mạnh của chúng.
David Richerby

Câu trả lời:


13

tl; dr backrefs.

Ngay khi có một \1(hoặc bất kỳ số nào không được sử dụng để thoát unicode) trong biểu thức chính quy, đó không phải là biểu thức chính quy.

Backrefs cho phép bạn khớp (a+)b\1với n lần atheo sau là b theo sau là n lần acho bất kỳ n> 1 nào. Đây không phải là ngôn ngữ thông thường (nó là con đẻ của ngôn ngữ không thông thường).

Điều cần thiết và gần như là đủ để backref tham chiếu một nhóm có chứa biểu thức chính quy phù hợp với một chuỗi dài tùy ý hoặc nó có chứa một *hoặc +. Ngoại lệ duy nhất (mà tôi đã tìm thấy) của biểu thức chính quy trong (A)B\1đó A là ngôn ngữ hữu hạn (có thể được thay thế bằng cách liệt kê tất cả các từ chấp nhận chúng). Bạn có thể chuyển đổi nó thành word1+Bword1|word2+Bword2vv vì A là hữu hạn.

Các nhóm tìm kiếm xung quanh không loại bỏ tính thường xuyên của biểu thức chính quy. A(?=B)Clà mặt cắt ngang của regexes AB.*ACvà mặt cắt ngang của 2 ngôn ngữ thường xuyên là thường xuyên. Cái nhìn tiêu cực là tương tự ngoại trừ việc sử dụng phần bổ sung của B.*(bổ sung cho các ngôn ngữ thông thường là thường xuyên). Lookbehind giống hệt như A(?<=B)Clà mặt cắt ngang của AC.*BC.


Điều này là cần thiết và đủ? Đối với tôi (a)\1, trong khi sử dụng backref, tương đương aavà do đó thường xuyên tầm thường. Tôi cũng tự hỏi nếu các xác nhận tìm kiếm có thể sử dụng để nhận ra các ngôn ngữ không thông thường.
MSalters

1
@MSalters: Nếu bạn muốn có được kỹ thuật thực sự, (a)\1không phải là một biểu thức thông thường, nhưng nhận ra một ngôn ngữ thông thường.
Jörg W Mittag
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.