Biểu thức chính quy VS Tên tập tin


15

Tôi biết rằng các biểu thức chính quy chỉ được sử dụng với các ký tự và chuỗi, nhưng đôi khi tôi tìm thấy chúng trong tên của các tệp. Câu hỏi của tôi là: regexes chỉ được sử dụng với các ký tự hoặc cũng có thể với tên tệp?

Câu trả lời:


19

Biểu thức thông thường và tên tập tin toàn cầu là hai điều rất khác nhau.

Biểu thức chính quy được sử dụng trong các lệnh / hàm để khớp mẫu trong văn bản. Ví dụ trong tham số mẫu của grephoặc trong các ngôn ngữ lập trình.

Tên tập tin toàn cầu được sử dụng bởi shell để khớp tên tập tin và thư mục bằng cách sử dụng ký tự đại diện. Các khả năng của Globing phụ thuộc vào vỏ. Bash, ví dụ, hỗ trợ các ký tự đại diện như:

  • * khớp 0 ký tự trở lên
  • ? khớp 1 ký tự
  • [...] phù hợp với một nhân vật trong bộ được chỉ định

Các ký tự đại diện này có thể trông tương tự như các biểu thức thông thường, thực sự [...]có cùng ý nghĩa trong Globing và regex. Nhưng *?có nghĩa là những điều khác nhau trong Globing và regex.

Trong một bình luận bạn đã viết:

nhưng làm thế nào người phiên dịch khác biệt * cho dù đó là một người pha trò hay regex? ví dụ : grep a*b a*.txt?

Dễ dàng. Sắp xếp

Trước hết, shell cố gắng diễn giải các ký tự đại diện, bằng cách ghép chúng với tên tệp. Nếu có các tệp bắt đầu bằng "a" và kết thúc bằng "b", shell sẽ thay thế a*bbằng tên tệp phù hợp. Cùng đi cho a*.txt. Nếu không có tên tệp phù hợp, shell sẽ chuyển các đối số greptheo đúng nghĩa đen.

Tuy nhiên, tham số đầu tiên grepphải là một mẫu. Trong 99.999% trường hợp sử dụng thực tế, bạn không muốn tham số đầu tiên được giải thích bởi trình bao. Vì vậy, rất có thể ý định là thế này:

grep "a*b" a*.txt

Nhờ trích dẫn a*b, shell sẽ không diễn giải nó bằng cách sử dụng Globing, và thay vào đó chuyển trực tiếp đến grep. Đổi lại, grepsẽ giải thích rằng như là một biểu thức thông thường (theo thiết kế).

Để tóm tắt, shell diễn giải dòng lệnh theo ngôn ngữ toàn cầu của chính nó, đó là sử dụng các ký tự đại diện. Các lệnh, chương trình diễn giải các tham số của chúng theo bất kỳ cách nào chúng được thiết kế bởi tác giả của chúng.


4

Nếu tên tệp là một chuỗi cho bạn, bạn cũng có thể sử dụng regex cho tên tệp. Ví dụ: nếu bạn muốn tìm tên tệp khớp với biểu thức chính quy, bạn có thể thử:

find ./ -regex '.*[abc][xyz].*'

Lệnh tìm kiếm các tệp có a, b hoặc c trong tên theo sau là x, y hoặc z. Đây chỉ là một ví dụ. Có những khả năng vô tận.


nhưng làm thế nào người phiên dịch khác biệt * cho dù đó là một người pha trò hay regex? ví dụ: $ grep a "asterix" b a "asterix" .txt
Hamza

2
Nếu bạn sử dụng, find ./ -name 'a*'bạn sử dụng * như một ký tự đại diện. Khi bạn gõ find ./ -regex 'a*', bạn sử dụng * trong regex. Sự khác biệt quan trọng là chuyển đổi -namehoặc -regex.
không ai
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.