2008-09-18 34 views
31

Câu hỏi khá cơ bản, tôi đang cố gắng viết một regex trong Vim để khớp với bất kỳ cụm từ nào bắt đầu bằng "abc " được theo sau bởi bất kỳ điều gì khác ngoài "defg".Vim: Làm cách nào để loại trừ toàn bộ một từ khỏi tìm kiếm của tôi?

Tôi đã sử dụng "[^defg]" để khớp với bất kỳ ký tự đơn nào khác ngoài d, e, f hoặc g.

Bản năng đầu tiên của tôi là dùng thử /abc [^\(defg\)] hoặc /abc [^\<defg\>] nhưng không phải một trong số đó hoạt động.

+0

bạn có ý nghĩa trước không? hoặc theo sau? Ví dụ của bạn dường như ngụ ý theo sau. – rampion

Trả lời

39

Đây là chuỗi tìm kiếm.

/abc \(defg\)\@! 

Khái niệm bạn đang tìm kiếm được gọi là xác nhận xem trước tiêu cực. Hãy thử điều này trong vim để biết thêm thông tin:

:help \@! 
+0

Đối với hồ sơ, tôi là người dùng emacs :-) – bmdhacks

+1

+1 Tôi đã có câu hỏi này trong một thời gian. Tôi đánh dấu nhận xét của bạn là spam nếu tôi không sợ nó làm tổn thương đại diện của bạn. – xdhmoore

0

Ở đây chúng tôi đi, đây là một lông một:

/\%(\%(.\{-}\)\@<=XXXXXX\zs\)* 

(thay thế XXXXXX với từ tìm kiếm). Thao tác này sẽ tìm kiếm mọi thứ có kích thước không chứa XXXXXX. Tôi tưởng tượng nếu bạn đã làm:

/abc \%(\%(.\{-}\)\@<=defg\zs\)* 

Điều này có thể hoạt động như bạn muốn. Hy vọng điều này sẽ giúp một chút!

-4

/abc \ [^ d] [^ e] [^ f] [^ g]

Nó khá rườm rà cho lời lớn hơn, nhưng hoạt động như một nét duyên dáng.

+1

Điều đó cũng không khớp với "abc daaa"? –

14

trước hoặc sau?

Nếu mọi thứ bắt đầu bằng 'abc' không phải là (ngay lập tức), theo sau là 'defg', bạn muốn bmdhacks' solution.

Nếu đó là bất cứ điều gì bắt đầu bằng 'abc' đó không phải (ngay lập tức) preceeded bởi 'defg', bạn muốn có một lookbehind tiêu cực:

/\%(defg\)\@<!abc/

này sẽ phù hợp bất kỳ xuất hiện của 'abc' miễn là nó không phải một phần của 'defgabc'. Xem :help \@<! để biết thêm chi tiết.

Nếu bạn muốn kết hợp 'abc' miễn là nó không phải là một phần của, sau đó chỉ cần thêm một .* 'defg * abc.':

/\%(defg.*\)\@<!abc/

Matching 'abc' chỉ trên đường nơi 'defg' không xảy ra tương tự:

/\%(defg.*\)\@<!abc \%(.*defg\)\@!/ 

Mặc dù, nếu bạn chỉ làm điều này cho thay người, bạn có thể làm dễ dàng hơn bằng cách kết hợp này :v//:s//

:%v/defg/s/abc /<whatever>/g 

Điều này sẽ thay thế '< bất cứ điều gì>' cho 'abc' trên tất cả các dòng không chứa 'defg'. Xem :help :v để biết thêm.

Các vấn đề liên quan