[[.Ch.]] Có nghĩa là gì trong regex?


11

Tiêu đề thay thế: "Trình tự đối chiếu" hoặc "phần tử đối chiếu" trong regex tuân thủ POSIX là gì?

Tôi đã tìm thấy định nghĩa kỹ thuật chính xác trong Phần 9.3.5 của thông số kỹ thuật POSIX , như mục số 4 trong danh sách, nhưng nó không thực sự rõ ràng đối với tôi.

Tôi tìm kiếm trên mạng về các ví dụ và giải thích và đưa ra không hoàn toàn trắng tay, nhưng chắc chắn không giác ngộ .

Điều duy nhất tôi nhận được là trong một số trường hợp nhất định, bạn có thể khiến regex của mình đối xử với nhiều nhân vật như thể họ là một nhân vật duy nhất để so sánh độ dài và xác định "trận đấu dài nhất" là gì (vì regex là tham lam và trả lại trận đấu dài nhất có thể).

Đó là tất cả, mặc dù? Tôi gặp khó khăn khi thấy việc sử dụng nó, nhưng tôi nghi ngờ sự hiểu biết của tôi là không đầy đủ. Điều gì thực sự là "đối chiếu" cho một regex? Và làm thế nào [[.ch.]], ví dụ trong thông số kỹ thuật POSIX, liên quan đến điều này?

Câu trả lời:


7

Các yếu tố đối chiếu thường được tham chiếu trong bối cảnh sắp xếp.

Trong nhiều ngôn ngữ, đối chiếu (sắp xếp như trong từ điển) không chỉ được thực hiện cho mỗi ký tự. Ví dụ, bằng tiếng Séc, chkhông sắp xếp giữa cgcigiống như tiếng Anh, nhưng được coi là toàn bộ để sắp xếp. Đây là một yếu tố đối chiếu (chúng ta không thể đề cập đến một nhân vật ở đây, nhân vật là một tập hợp con của các yếu tố đối chiếu) sắp xếp ở giữa hi.

Bây giờ bạn có thể hỏi, những gì có liên quan đến biểu thức thông thường? , Tại sao tôi muốn tham chiếu đến một phần tử đối chiếu trong biểu thức ngoặc? .

Vâng, bên trong biểu thức khung, người ta không sử dụng thứ tự. Chẳng hạn [c-j], bạn muốn các ký tự ở giữa cj. Vâng, phải không? Bạn muốn có các yếu tố đối chiếu ở đó. [h-i]trong một trận địa phương Séc ch:

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[h-i]o'
cho

Vì vậy, nếu bạn có thể liệt kê một loạt các yếu tố đối chiếu trong biểu thức khung, thì bạn cũng có thể liệt kê chúng một cách riêng lẻ. [a-cch]sẽ phù hợp với các yếu tố đối chiếu ở giữa acchký tự. Để có a-cchphần tử đối chiếu, chúng ta cần một cú pháp mới:

$ echo cho | LC_ALL=cs_CZ.UTF-8 grep '^[a-c[.ch.]]o'
cho

(những người ở giữa acchmột).

Bây giờ, thế giới vẫn chưa hoàn hảo và có lẽ sẽ không bao giờ. Ví dụ trên là trên một hệ thống GNU và đã hoạt động. Một ví dụ khác về yếu tố đối chiếu có thể là evới giọng kết hợp cấp tính trong UTF-8 ( $'e\u0301'được hiển thị như $'\u00e9'é).

é và é là cùng một nhân vật ngoại trừ một người được đại diện với một nhân vật và người kia có hai nhân vật.

$ echo $'e\u301t\ue9' | grep '^[d-f]t'

Sẽ hoạt động đúng trên một số hệ thống nhưng không phải hệ thống khác (chẳng hạn như GNU). Và không rõ là $'[[.\ue9.]]'chỉ nên khớp $'\ue9'hay cả hai $'\ue9'$'e\u301'.

Không đề cập đến các tập lệnh không phải là chữ cái hoặc các tập lệnh với các thứ tự sắp xếp theo khu vực, khác nhau, những thứ như ( ffitrong một ký tự) trở nên khó xử lý với API đơn giản như vậy.


1

Điều này là hữu ích khi các ký tự không phải tiếng Anh (không phải ascii) được sử dụng. Ví dụ chbạn đề cập là một bản tóm tắt , tức là một số ngôn ngữ có một chữ cái trong bảng chữ cái của chúng là / có thể được biểu thị bằng hai chữ cái trong bảng chữ cái tiếng Anh.

Khi bạn sử dụng [.ch.]trong một biểu thức chính quy, về cơ bản, bạn nói: "Tôi mong đợi một chuỗi đầu vào không phải tiếng Anh với máy in ch. Tôi muốn biểu thức chính của mình khớp với trình duyệt đơn ch. Ngôn ngữ lập trình / công cụ regex / bàn phím của tôi không cho phép tôi viết bản thảo này đăng nhập, vì vậy tôi nhập [.ch.]. Tôi không có nghĩa là ctheo sau bởi một h. Xin vui lòng chỉ tìm thấy sự xuất hiện của bản vẽ dưới dạng một charachter duy nhất. "

[[.ch.]]có nghĩa là sơ đồ là một phần của tập hợp các ký tự. Trong trường hợp này chỉ có một nhân vật thực sự. Chỉ cần ký hiệu regrec tiêu chuẩn.


Từ câu trả lời của Stephane, có vẻ như thực sự ch hai nhân vật khác nhau; nó chỉ được coi là một cho mục đích phân loại. Bạn có chắc chắn "digraph" là một thuật ngữ áp dụng?
tự đại diện
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.