Văn bản & công cụ hàng ngày · Bộ công cụ văn bản
Từ Kleene đến JavaScript: lịch sử ngắn gọn về biểu thức chính quy
· Lý lịch
regular-expressions javascript computing-history
Theo dõi các biểu thức chính quy từ lý thuyết automata những năm 1950 thông qua ed, grep và Perl cho đến phiên bản JavaScript trong mọi trình duyệt, giải thích lý do tại sao cú pháp trông giống như vậy và những tính năng nào xuất hiện khi nào.
Ngôn ngữ nhỏ kỳ lạ mà mọi người đều biết một nửa - tại sao cú pháp Regex có cảm giác cổ xưa và không nhất quán
Cụm từ thông dụng có cảm giác giống như một ngôn ngữ được tập hợp qua các thời đại vì về cơ bản chúng là như vậy. Cốt lõi nhỏ gọn của sự luân phiên, lặp lại và nhóm đã phát triển từ ký hiệu toán học thành các lệnh soạn thảo, bộ lọc dòng lệnh và các tính năng ngôn ngữ lập trình. Dấu câu vẫn tồn tại trong khi mỗi máy chủ bổ sung thêm các tiện ích, ràng buộc và thuật ngữ riêng.
Lịch sử đó giải thích tại sao một mẫu có thể trông quen thuộc nhưng lại hoạt động khác nhau giữa grep, Perl, Python và JavaScript. “Regex” là một tên gia đình, không phải là một ngữ pháp phổ quát. Đối với một nhà phân tích tự học, bài học hữu ích không phải là ghi nhớ mọi phương ngữ mà là xác định động cơ, cờ và quy tắc thay thế trước khi tin tưởng vào một mẫu mượn.
Các sự kiện thường xuyên của Kleene - toán học về ô tô hữu hạn những năm 1950 đã mang lại cho chúng ta ngôi sao
Công trình của Stephen Cole Kleene về ô tô hữu hạn và “các sự kiện đều đặn” đã cung cấp nền tảng lý thuyết trong những năm 1950. Ký hiệu của ông mô tả các tập hợp chuỗi ký hiệu bằng cách sử dụng các phép toán bao gồm hợp, nối và đóng. Thao tác đóng đã trở thành ngôi sao Kleene: `A*` có nghĩa là không có hoặc nhiều lần lặp lại được rút ra từ A, chứ không chỉ đơn thuần là “lặp lại một hoặc nhiều lần”.
Các ngôn ngữ chính quy chính quy được công nhận bởi automata hữu hạn hẹp hơn nhiều cấu trúc hiện được bán dưới nhãn biểu thức chính quy. Ví dụ, tham chiếu ngược có thể biểu thị các điều kiện ngoài mô hình cổ điển đó. Do đó, các công cụ hiện đại bảo tồn tên lịch sử và phần lớn ký hiệu trong khi triển khai các ngôn ngữ mẫu có khả năng và chiến lược thực hiện vượt ra ngoài đối tượng toán học ban đầu của Kleene.
Thompson, ed và grep - cách mà Regex tham gia chỉnh sửa văn bản vào cuối những năm 1960 và đầu những năm 1970 Các công cụ Unix
Ken Thompson đã kết nối lý thuyết này với các công cụ văn bản đang hoạt động. 1968 Truyền thông của ông về bài báo ACM đã mô tả việc biên dịch các biểu thức chính quy thành mã máy để tìm kiếm văn bản và công việc biên tập trước đây của ông đã giúp đặt việc so khớp mẫu bên trong dòng Unix. Trình chỉnh sửa `ed` đã sử dụng biểu thức chính quy trong các lệnh chọn và chuyển đổi các dòng khớp.
Tên `grep` xuất phát từ lệnh `ed` thường được hiển thị dưới dạng `g/re/p`: chọn toàn bộ các dòng khớp với biểu thức chính quy và in chúng. Grep ban đầu không phải là tập hợp các tùy chọn GNU ngày nay và các biểu mẫu POSIX cơ bản và mở rộng sau này cũng khác nhau. Sự thay đổi lâu dài là thực tế: một ngôn ngữ biểu tượng nhỏ đã trở thành giao diện hàng ngày để tìm kiếm văn bản.
Perl và PCRE — các tiện ích mở rộng đã thêm các bộ định lượng không tham lam, cách xem xét và cú pháp mà hầu hết các công cụ đều sao chép ngày nay
Perl đã tạo ra một ngôn ngữ mẫu phong phú hơn làm trung tâm cho lập trình có mục đích chung. Trên các phiên bản của nó, các lập trình viên đã gặp phải các nhóm thu thập, phản hồi ngược, xác nhận, bộ định lượng lười biếng và bộ sửa đổi mẫu trong một hệ sinh thái dễ thấy. Tài liệu Perl 5 ghi lại các cấu trúc như `*?` để khớp tối thiểu và `(?=...)` để xem xét tích cực, cùng với nhiều tính năng không có trong các dạng Unix cũ hơn.
Sẽ an toàn hơn khi nói rằng Perl đã phổ biến phong cách này hơn là cho rằng nó đã phát minh ra mọi tiện ích mở rộng. PCRE cố tình đưa ra cú pháp tương thích với Perl, trong khi các công cụ khác áp dụng các ý tưởng đã chọn và từ chối các ý tưởng khác. Dấu câu được chia sẻ có thể ẩn các ngữ nghĩa, hành vi hoặc hiệu suất Unicode khác nhau. Do đó, “giống Perl” mô tả một ảnh hưởng rộng rãi, không đảm bảo rằng mẫu Perl có thể di chuyển được.
Perl đã phổ biến một ngôn ngữ mẫu thực tế lớn hơn; động cơ sau này mượn có chọn lọc
JavaScript đã chuẩn hóa các đối tượng `RegExp` và cú pháp chữ của chính nó, chẳng hạn như `/pattern/gi`, cho các chương trình chạy trong trình duyệt và các môi trường ECMAScript khác. Hương vị của nó bao gồm các nhóm thu thập và không thu thập, tham chiếu ngược, xem trước, định lượng lười biếng và các lớp ký tự. Các phiên bản sau này đã thêm các nhóm chụp có tên và các xác nhận xem xét phía sau trong đặc tả ES2018.
JavaScript không phải là PCRE hoặc Python có các dấu phân cách khác nhau. Tính khả dụng của tính năng phụ thuộc vào phiên bản ECMAScript do công cụ triển khai và cờ là một phần của hành vi chứ không phải là trang trí. Hướng dẫn biểu thức chính quy của MDN là tài liệu tham khảo thực tế có liên quan cho cú pháp trình duyệt, nhưng ngay cả các ví dụ JavaScript hợp lệ cũng có thể dựa vào các cờ mà một giao diện cụ thể không hiển thị.
JavaScript đã giành được các nhóm được đặt tên và theo dõi trong ES2018, nhưng động cơ và cờ vẫn khác nhau
Các trình duyệt đặt công cụ biểu thức chính quy JavaScript gần tác vụ văn bản thông thường. Một trang có thể biên dịch mẫu, đếm kết quả trùng khớp và chuyển mẫu đó đến `String.prototype.replace` mà không cần gửi văn bản đến dịch vụ biểu thức chính quy chuyên dụng. Tính khả dụng đó giúp cho giao diện tìm và thay thế phía trình duyệt trở nên khả thi, mặc dù trang xung quanh vẫn phải được kiểm tra riêng để biết các yêu cầu về quyền riêng tư rộng hơn.
Quá trình triển khai của ToolAcre gọi `new RegExp` bên trong `compilePattern`, phát hiện lỗi biên dịch và trả về lỗi thay vì ném. `findReplace` đếm các kết quả trùng khớp trước khi áp dụng thao tác thay thế tiêu chuẩn. Kết quả là JavaScript mã thông báo thay thế chẳng hạn như tham chiếu chụp theo chuỗi máy chủ API; Cú pháp biểu thức chính quy và cú pháp thay thế là những ngôn ngữ có liên quan nhưng khác biệt.
Điều này không bao gồm những gì - lý thuyết ngôn ngữ hình thức ngoài những điều cơ bản và nội dung hiệu suất động cơ
Lịch sử ngắn gọn này không chứng minh sự tương đương giữa các công cụ thực tế và automata hữu hạn, khảo sát các thuật toán thực thi biểu thức chính quy hoặc xếp hạng việc triển khai theo tốc độ. Quay lui, kỹ thuật thời gian tuyến tính và mô hình bệnh lý cần được xử lý riêng biệt. Bộ phận bảo vệ ToolAcre phát hiện các lỗi cú pháp nhưng không phát hiện được biểu thức hợp lệ thực hiện việc quay lui quá mức và làm dừng luồng chính của trình duyệt.
Dòng thời gian cũng không chỉ định mọi siêu ký tự cho một nhà phát minh duy nhất. Các tính năng của phần mềm thường xuất hiện thông qua các bài báo, biên tập viên, bản phát hành ngôn ngữ và các bản triển khai lại tương thích thay vì một lần chuyển giao rõ ràng. Các nguồn hỗ trợ các mốc quan trọng cụ thể; họ không biện minh cho câu chuyện đơn giản hơn rằng một sản phẩm đã tạo ra hệ thống bán buôn theo biểu thức chính quy hiện đại hoặc các hương vị sau này kế thừa hành vi giống hệt nhau.
Bài học rút ra — chế độ biểu thức chính quy của Bộ công cụ văn bản là phiên bản JavaScript, do đó các mẫu từ tài liệu trình duyệt hoạt động như được viết
Tính kế thừa thực tế được hiển thị trong ToolAcre: bật Regex và văn bản tìm kiếm được biên soạn bởi công cụ JavaScript của trình duyệt. Tắt Regex và các siêu ký tự sẽ được thoát, làm cho việc tìm kiếm trở nên đúng nghĩa. Toàn bộ từ bao bọc biểu thức bằng ranh giới `` kiểu ASCII, trong khi độ phân biệt chữ hoa chữ thường sẽ kiểm soát xem cờ `i` có đi kèm với cờ `g` toàn cầu luôn hiện diện hay không.
Chi tiết cuối cùng đó điều chỉnh lời hứa chung của phác thảo rằng các mẫu tài liệu trình duyệt hoạt động như được viết. ToolAcre không hiển thị cờ nhiều dòng, dấu chấm, cố định hoặc Unicode, vì vậy các ví dụ yêu cầu `m`, `s`, `y`, `u` hoặc `v` cần được điều chỉnh và một số không thể sao chép ở đó. Sử dụng công cụ này để kiểm tra các mẫu JavaScript được hỗ trợ, đọc số lượng thay thế và hoàn tác trước khi tinh chỉnh.