Trong thư mục chính của tôi, tôi có một thư mục drupal-6.14 chứa nền tảng Drupal.Biểu hiện chính xác tiêu cực lookahead
Từ thư mục này tôi sử dụng lệnh sau:
find drupal-6.14 -type f -iname '*' | grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*' | xargs tar -czf drupal-6.14.tar.gz
gì lệnh này làm là gzips thư mục drupal-6.14, trừ tất cả các thư mục con của drupal-6.14/trang web/trừ các trang web/tất cả và các trang web/mặc định, bao gồm.
Câu hỏi của tôi là về biểu thức chính quy:
grep -P 'drupal-6.14/(?!sites(?!/all|/default)).*'
Khái niệm làm việc để loại trừ tất cả các thư mục Tôi muốn loại trừ, nhưng tôi hoàn toàn không hiểu tại sao.
Đó là một nhiệm vụ thường sử dụng biểu thức thông thường để
trận đấu tất cả các chuỗi, ngoại trừ những không chứa subpattern x. Hay nói cách khác, phủ nhận một mẫu con.
I (think) Tôi hiểu rằng chiến lược chung để giải quyết những vấn đề này là sử dụng những cái nhìn tiêu cực, nhưng tôi chưa bao giờ hiểu mức độ hài lòng và tiêu cực (trước/sau).
Trong những năm qua, tôi đã đọc nhiều trang web trên chúng. Hướng dẫn sử dụng PHP và Python regex, các trang khác như http://www.regular-expressions.info/lookaround.html và vân vân, nhưng tôi chưa bao giờ thực sự hiểu rõ về chúng.
Ai đó có thể giải thích, làm thế nào điều này đang làm việc, và có lẽ cung cấp một số ví dụ tương tự mà sẽ làm những việc tương tự?
- Cập nhật One:
Về phản ứng Andomar của: có thể một đôi lookahead tiêu cực được ngắn gọn hơn thể hiện dưới dạng một tuyên bố lookahead tích cực duy nhất:
tức là:
'drupal-6.14/(?!sites(?!/all|/default)).*'
tương đương với:
'drupal-6.14/(?=sites(?:/all|/default)).*'
???
- Cập nhật thứ hai:
Theo @andomar và @alan moore - bạn không thể trao đổi đôi lookahead tiêu cực đối với lookahead tích cực.
Nếu một cái nhìn tiêu cực lồng nhau ("cái nhìn tiêu cực kép") có thể trở thành một cái nhìn tích cực, liệu nó có thể thể hiện trạng thái tương đương ở dạng lookahead dương? i.e: (a) Điều gì sẽ là hình thức lookahead tích cực của drupal tiêu cực kép của tôi drupal "'drupal-6.14/(?! sites (?!/all |/default)). *'" Ví dụ? Có thể là: 'drupal-6.14/(? = Sites/all | default). * ??? (b) Điều gì sẽ là hình thức lookahead tích cực của cái nhìn đôi tiêu cực của bạn "(!? B (?! C))" ví dụ? – themesandmodules
eww. lấy làm tiếc. lần đầu tiên sử dụng bình luận ở đây là định dạng là khủng khiếp. nghỉ ngơi bằng cách chỉnh sửa câu hỏi. – themesandmodules
@willieseabrook: Đừng nghĩ như vậy, chỉ một phần của lookahead là gấp đôi tiêu cực, vì vậy bạn không thể thay thế toàn bộ với một tích cực – Andomar