Kết hợp các ký tự đặc biệt với Biểu thức chính quy


10

Nói rằng thật dễ dàng nếu tôi muốn tìm một cái gì đó có chứa các chữ cái và chữ thường

sản xuất | grep -E '[0-9a-z]'

Chân đế hữu ích để khớp với một tập hợp các ký tự, nhưng còn những cái có phần đặc biệt thì sao?
Nếu tôi muốn, sử dụng dấu ngoặc, khớp với bất kỳ ký tự nào, ngoại trừ một trong các ký tự này: dấu ngoặc đóng ], dấu gạch ngang (hoặc dấu gạch nối) "-", cả dấu gạch chéo /\dấu mũ ^, dấu hai chấm :.
Nó sẽ trông như thế này (tôi biết điều này không hoạt động)?

[^] - / \ ^:]

Câu trả lời:


11

Để khớp với nghĩa đen ]và nghĩa đen -trong Biểu thức khung, bạn sẽ phải sử dụng chúng như thế này:

[^]/\^:-]

hoặc, thậm chí tốt hơn, vì một số công cụ yêu cầu dấu gạch chéo ngược phải được thoát :

[^]/\\^:-]

đó là
Dấu ngoặc vuông phải (']') sẽ mất ý nghĩa đặc biệt và thể hiện chính nó trong biểu thức ngoặc nếu nó xuất hiện đầu tiên trong danh sách (sau ký tự '^' ban đầu, nếu có)

ký tự dấu gạch nối sẽ được xử lý như chính nó nếu nó xuất hiện đầu tiên (sau '^' ban đầu, nếu có) hoặc cuối cùng trong danh sách
do đó
Nếu một biểu thức ngoặc chỉ định cả '-' và ']', ']' sẽ được đặt trước (sau '^', nếu có) và '-' cuối cùng trong biểu thức ngoặc.
Các quy tắc cho biểu thức ngoặc là giống nhau cho EREBRE .


2
Tôi muốn nhân đôi dấu gạch chéo ngược để ở bên an toàn. Nó cần thiết với nhiều awktriển khai và perlví dụ.
Stéphane Chazelas

Thế còn "Từ dấu mũ đến khung đóng"? Giống như [^-]](Cái này thất bại)?
iBug

2
@iBug - chắc chắn nó thất bại vì khung bên phải phải là đầu tiên nếu bạn muốn khớp nó theo nghĩa đen. Tôi không chắc chắn tôi có được điểm của "phạm vi" mà bạn đề cập đến như vậy ^sau ]đó [^-]]sẽ không hoạt động ngay cả khi cả hai ^]được đối xử theo nghĩa đen (giống như [b-a]). Dù sao, nếu bạn muốn khớp từ vd ;đến đóng ngoặc, bạn có thể sử dụng một phạm vi lên tới char trước ](dấu gạch chéo ngược) và bao gồm ]như char đầu tiên trong biểu thức ngoặc, vd [];-\\].
don_crissti

@don_crissti Còn gì [[.^.]-[.-.]]? Tôi có cảm giác rằng điều này sẽ làm việc. Hãy giả sử rằng mã ASCII ^là trước đây -.
iBug

Có một giải pháp lười biếng cho câu hỏi của tôi. Đơn giản chỉ cần lấy mọi thứ đặc biệt để đối chiếu các ký tự, như[^[.].][.-.]/\^:]
iBug

7

Kỳ lạ có lẽ, bạn cần phải có một vài nhân vật ở những nơi cụ thể. Bạn phải có ]ký tự đầu tiên trong một bộ và -phải là ký tự cuối cùng trong một bộ.

Đây là một RE đáp ứng yêu cầu của bạn [^]\^/-]::

echo 'Hello[world]-[sun] ^^ 4/5 or 3\4' | grep -Eo '[^]\^/-]' | xargs
H e l l o [ w o r l d [ s u n 4 5 o r 3 4

1
Điều đó không thực sự lạ, chỉ cần tránh sự mơ hồ
Kevin

1
Nhân [vật thứ hai không thuộc về nơi đó; OP không muốn loại trừ nó.
Scott

@ Phát hiện tốt, cảm ơn bạn. Trả lời cập nhật.
roaima
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.