Biết hương vị regex của bạn
Có một số lượng đáng ngạc nhiên những người nghĩ rằng các biểu thức thông thường về cơ bản là bất khả tri ngôn ngữ. Tuy nhiên, thực sự có sự khác biệt khá lớn giữa các hương vị, và đặc biệt đối với môn đánh gôn, thật tốt khi biết một vài trong số chúng, và các tính năng thú vị của chúng, vì vậy bạn có thể chọn thứ tốt nhất cho mỗi nhiệm vụ. Dưới đây là một cái nhìn tổng quan về một số hương vị quan trọng và những gì làm cho chúng khác biệt với những hương vị khác. (Danh sách này không thể thực sự đầy đủ, nhưng hãy cho tôi biết nếu tôi bỏ lỡ điều gì đó thực sự rõ ràng.)
Perl và PCRE
Tôi đang ném những thứ này vào một nồi, vì tôi không quá quen thuộc với hương vị Perl và chúng gần như tương đương (PCRE là dành cho Biểu thức chính quy tương thích Perl). Ưu điểm chính của hương vị Perl là bạn thực sự có thể gọi mã Perl từ bên trong regex và thay thế.
- Đệ quy / chương trình con . Có lẽ là tính năng quan trọng nhất để chơi golf (chỉ tồn tại trong một vài hương vị).
- Mẫu có điều kiện
(?(group)yes|no)
.
- Hỗ trợ thay đổi của trường hợp trong chuỗi thay thế với
\l
, \u
, \L
và \U
.
- PCRE cho phép luân phiên trong giao diện, trong đó mỗi phương án có thể có độ dài khác nhau (nhưng cố định). (Hầu hết các hương vị, bao gồm Perl yêu cầu lookbehind phải có chiều dài cố định tổng thể.)
\G
để neo một trận đấu đến cuối trận đấu trước.
\K
để thiết lập lại bắt đầu của trận đấu
- PCRE hỗ trợ cả thuộc tính và tập lệnh Unicode .
\Q...\E
để thoát khỏi các nhân vật chạy dài hơn. Hữu ích khi bạn đang cố gắng khớp chuỗi có chứa nhiều ký tự meta.
.MẠNG LƯỚI
Đây có lẽ là hương vị mạnh mẽ nhất, chỉ có rất ít thiếu sót.
Một thiếu sót quan trọng trong việc chơi golf là nó không hỗ trợ các bộ lượng hóa sở hữu như một số hương vị khác. Thay vì .?+
bạn sẽ phải viết (?>.?)
.
Java
- Do một lỗi (xem Phụ lục) Java hỗ trợ một loại hình nhìn có độ dài thay đổi hạn chế: bạn có thể tìm mọi cách từ đầu chuỗi đến
.*
từ nơi bạn có thể bắt đầu một giao diện, như thế nào (?<=(?=lookahead).*)
.
- Hỗ trợ công đoàn và giao điểm của các lớp nhân vật.
- Có sự hỗ trợ rộng rãi nhất cho Unicode, với các lớp ký tự cho "tập lệnh Unicode, khối, danh mục và thuộc tính nhị phân" .
\Q...\E
như trong Perl / PCRE.
Hồng ngọc
Trong các phiên bản gần đây, hương vị này mạnh mẽ tương tự như PCRE, bao gồm hỗ trợ cho các cuộc gọi chương trình con. Giống như Java, nó cũng hỗ trợ liên kết và giao điểm của các lớp ký tự. Một tính năng đặc biệt là lớp ký tự tích hợp cho các chữ số hex: \h
(và phủ định \H
).
Tính năng hữu ích nhất để chơi gôn là cách Ruby xử lý các bộ định lượng. Đáng chú ý nhất, có thể lồng các bộ định lượng mà không cần dấu ngoặc đơn. .{5,7}+
hoạt động và như vậy .{3}?
. Ngoài ra, trái ngược với hầu hết các hương vị khác, nếu giới hạn dưới của bộ định lượng là 0
nó có thể được bỏ qua, ví dụ như .{,5}
tương đương với .{0,5}
.
Đối với các chương trình con, sự khác biệt chính giữa các chương trình con của PCRE và các chương trình con của Ruby, là cú pháp của Ruby dài hơn một byte (?n)
so với \g<n>
, nhưng các chương trình con của Ruby có thể được sử dụng để chụp, trong khi PCRE đặt lại sau khi kết thúc chương trình con.
Cuối cùng, Ruby có ngữ nghĩa khác nhau cho các sửa đổi liên quan đến dòng hơn hầu hết các hương vị khác. Công cụ sửa đổi thường được gọi m
trong các hương vị khác luôn có trong Ruby. Vì vậy, ^
và $
luôn luôn khớp với đầu và cuối của một dòng không chỉ là đầu và cuối của chuỗi. Điều này có thể giúp bạn tiết kiệm một byte nếu bạn cần hành vi này, nhưng nó sẽ khiến bạn tốn thêm byte nếu bạn không, bởi vì bạn sẽ phải thay thế ^
và $
bằng \A
và \z
, tương ứng. Ngoài ra, công cụ sửa đổi thường được gọi s
(thay thế cho các nguồn cấp dữ liệu .
khớp) được gọi m
trong Ruby thay thế. Điều này không ảnh hưởng đến số byte, nhưng nên ghi nhớ để tránh nhầm lẫn.
Con trăn
Python có hương vị đặc, nhưng tôi không biết bất kỳ tính năng đặc biệt hữu ích nào mà bạn sẽ không tìm thấy ở bất kỳ nơi nào khác.
Tuy nhiên , có một hương vị thay thế được dự định để thay thế re
mô-đun tại một số điểm, và có chứa nhiều tính năng thú vị. Ngoài việc thêm hỗ trợ cho đệ quy, giao diện có độ dài thay đổi và toán tử kết hợp lớp ký tự, nó còn có tính năng duy nhất của kết hợp mờ . Về bản chất, bạn có thể chỉ định một số lỗi (chèn, xóa, thay thế) được phép và động cơ cũng sẽ cung cấp cho bạn các kết quả gần đúng.
Bản thảo
Hương vị ECMAScript rất hạn chế, và do đó hiếm khi rất hữu ích cho việc chơi golf. Điều duy nhất nó có được là lớp nhân vật trống bị phủ [^]
định để phù hợp với bất kỳ nhân vật nào cũng như lớp nhân vật trống thất bại vô điều kiện []
(trái ngược với thông thường (?!)
). Thật không may, hương vị không có bất kỳ tính năng nào làm cho cái sau hữu ích cho các vấn đề bình thường.
Lua
Lua có hương vị khá độc đáo của riêng nó, khá hạn chế (ví dụ: bạn thậm chí không thể định lượng được các nhóm) nhưng đi kèm với một số tính năng hữu ích và thú vị.
- Nó có một số lượng lớn các tốc ký cho các lớp ký tự tích hợp , bao gồm dấu câu, ký tự chữ hoa / thường và chữ số hex.
- Với
%b
nó hỗ trợ một cú pháp rất nhỏ gọn để phù hợp với các chuỗi cân bằng. Ví dụ: %b()
khớp một (
và sau đó mọi thứ cho đến khớp )
(bỏ qua các cặp khớp bên trong một cách chính xác). (
và )
có thể là bất kỳ hai nhân vật ở đây.
Tăng cường
Hương vị regex của Boost về cơ bản là của Perl. Tuy nhiên, nó có một số tính năng mới tuyệt vời để thay thế regex, bao gồm thay đổi trường hợp và điều kiện . Cái sau là duy nhất để Boost theo như tôi biết.