Tại sao một số lệnh regex có nội dung ngược lại '\' với các ký tự khác nhau?


10

Lấy ví dụ, lệnh này:

find . -regex ".*\.\(cpp\|h\)"

Điều này sẽ tìm thấy tất cả các tệp .h và .cpp trong thư mục của bạn. Ký tự dấu chấm '.' trong các biểu thức thông thường thường có nghĩa là "bất kỳ nhân vật". Để làm cho nó chỉ khớp với một khoảng thời gian thực tế, bạn phải thoát nó bằng ký tự dấu gạch chéo ngược '\'.

Trong trường hợp này, được cho một nhân vật có ý nghĩa đặc biệt, bạn phải thoát khỏi nó để có được nhân vật thực tế mà nó đại diện.

Bây giờ, lấy dấu ngoặc đơn và thanh "hoặc", lần lượt là các ký tự '(', ')' và '|'. Chúng cũng có ý nghĩa đặc biệt, được sử dụng để nhóm các biểu thức thông thường. Tuy nhiên, để có được ý nghĩa đặc biệt, các ký tự phải được thoát bằng cách sử dụng dấu gạch chéo ngược! Không có dấu gạch chéo ngược, các ký tự có ý nghĩa của ký tự thực mà nó đại diện.

Tại sao vậy '.' đối xử khác với '(', ')' và '|'?

Câu trả lời:


12

Câu trả lời thực sự là "chỉ vì". Có một loạt các cú pháp biểu thức chính quy khác nhau, và trong khi chúng có chung một ngoại hình và thông thường các khái niệm cơ bản là giống nhau, chúng khác nhau về các chi tiết.

Trong lịch sử, mọi công cụ đều có cách thực hiện mới, làm bất cứ điều gì tác giả nghĩ tốt nhất. Có sự cân bằng giữa việc làm cho các nhân vật trở nên đặc biệt có và không có lối thoát - quá nhiều nhân vật "đặc biệt tự nhiên" và cuối cùng bạn phải thoát khỏi họ chỉ để khớp với họ; hoặc, theo cách khác, cuối cùng bạn cần một loạt các lối thoát để sử dụng cú pháp regex phổ biến như nhóm (). Và mọi người viết một chương trình đã quyết định cách thực hiện dựa trên nhu cầu của chương trình của họ phù hợp với điều gì, dựa trên những gì họ cảm thấy là cách tiếp cận phù hợp và trên giai đoạn của mặt trăng.

Có một nỗ lực tiêu chuẩn hóa từ POSIX, trong đó xác định " biểu thức chính quy cơ bản " và " biểu thức chính quy mở rộng ". Đáng kinh ngạc, những công việc này ngược với nhau liên quan đến \- đôi khi , nhưng không phải với sự nhất quán hoàn hảo.

Các biểu thức chính quy của Perl đã trở thành một tiêu chuẩn defacto khác, vì hai lý do: thứ nhất, chúng rất linh hoạt và mạnh mẽ, và thứ hai, chúng thực sự khá lành mạnh , với các quy ước như "\ luôn thoát khỏi một ký tự không chữ và số".

GNU Find có một -regextypetùy chọn, trong đó bạn có thể thay đổi cú pháp biểu thức chính quy được sử dụng. Đáng buồn thay, "perl" không phải là một lựa chọn, ít nhất là trong phiên bản tìm thấy tôi có. (Mặc định là, không đáng ngạc nhiên từ GNU, "emacs" và cú pháp đó được ghi lại ở đây .)

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.