Các công cụ và phiên bản khác nhau của chúng hỗ trợ các biến thể khác nhau của biểu thức chính quy. Các tài liệu của mỗi sẽ cho bạn biết những gì họ hỗ trợ.
Các tiêu chuẩn tồn tại để người ta có thể dựa vào một bộ tính năng tối thiểu có sẵn trên tất cả các ứng dụng phù hợp.
Ví dụ, tất cả các triển khai hiện đại sed
và grep
thực hiện các biểu thức chính quy cơ bản theo quy định của POSIX (ít nhất là một phiên bản hoặc phiên bản khác của tiêu chuẩn, nhưng tiêu chuẩn đó đã không phát triển nhiều về vấn đề đó trong vài thập kỷ qua).
Trong POSIX BRE và ERE, bạn có [:alnum:]
lớp nhân vật. Điều đó khớp với các chữ cái và chữ số trong miền địa phương của bạn (lưu ý thường bao gồm nhiều hơn a-zA-Z0-9
trừ khi miền địa phương là C).
Vì thế:
grep -x '[[:alnum:]_]\{1,\}'
phù hợp với một hoặc nhiều alnums hoặc _.
[\w]
được POSIX yêu cầu để khớp với dấu gạch chéo ngược hoặc w
. Vì vậy, bạn sẽ không tìm thấy grep
hoặc sed
thực hiện ở nơi có sẵn (trừ khi thông qua các tùy chọn không chuẩn).
Hành vi cho \w
một mình không được chỉ định bởi POSIX, vì vậy việc triển khai được phép thực hiện những gì họ muốn. GNU grep
nói thêm rằng một thời gian dài trước đây.
GNU grep
đã từng có công cụ regrec riêng của mình, tuy nhiên hiện tại nó sử dụng công cụ GNU libc (mặc dù nó có nhúng bản sao của chính nó).
Nó có nghĩa là để phù hợp với alnums và gạch dưới trong miền địa phương của bạn. Tuy nhiên, hiện tại nó có một lỗi ở chỗ nó chỉ khớp với các ký tự một byte (ví dụ, không phải là ngôn ngữ UTF-8 mặc dù đó rõ ràng là một chữ cái và mặc dù nó khớp với tất cả các địa phương trong đó é là một ký tự tính cách).
Ngoài ra còn có một \w
toán tử regrec trong perl regrec và trong PCRE. PCRE / perl không phải là biểu thức chính quy POSIX, chúng chỉ là một thứ khác hoàn toàn.
Bây giờ, với cách GNU grep -P
sử dụng PCRE, nó có vấn đề tương tự như không có -P
. Nó có thể được xử lý xung quanh đó bằng cách sử dụng (*UCP)
(mặc dù điều đó cũng có tác dụng phụ ở các địa phương không phải UTF8).
GNU sed
cũng sử dụng regexs của GNU libc cho các biểu thức chính của nó. Nó sử dụng nó theo cách như vậy mặc dù nó không có lỗi tương tự như GNU grep
.
GNU sed
không hỗ trợ PCRE. Có một số bằng chứng trong mã rằng nó đã được thử trước đó, nhưng dường như nó không còn nằm trong chương trình nghị sự nữa.
Nếu bạn muốn biểu thức chính quy của Perl, chỉ cần sử dụng perl
.
Mặt khác, tôi nói rằng thay vì cố gắng dựa vào một tính năng không chuẩn không có thật của việc triển khai sed
/ cụ thể của bạn grep
, thì tốt hơn là nên tuân thủ tiêu chuẩn và sử dụng [_[:alnum:]]
.
[_[:alnum:]]
là một cách giải quyết tốt cho phép tôi mở rộng nó giống như[\w/]
([_[:alnum:]/]
trong trường hợp đó).