Neo "Zoom"
Ngoài câu trả lời của @ jecxjo, có nhiều tình huống bạn có thể sử dụng các neo có độ rộng bằng không \zs
và \ze
thay vì nhìn tích cực. Các neo này xác định start ( \zs
) và end ( \ze
) của trận đấu trong mẫu đầy đủ.
Ví dụ
foo\zsbar
sẽ khớp bar
trước foo
( foo
không phải là một phần của trận đấu)
foo\zebar
sẽ khớp foo
theo sau bar
( bar
không phải là một phần của trận đấu)
myFunction(\zs.*\ze)
sẽ khớp với các tham số trong lệnh gọi hàm (cho mục đích trình diễn, tôi không tập trung vào kết hợp tham lam và không tham lam)
Đưa nó vào sử dụng
Chúng trở nên hữu ích nhất khi sử dụng :substitute
lệnh. Ví dụ: giả sử tôi muốn thay thế các tham số trong lệnh gọi hàm myFunction()
bằng foo
:
:%s/myFunction(\zs.*\ze)/foo/
Điều này sẽ để lại myFunction(
và )
nguyên vẹn, và bạn không phải lo lắng về việc bắt chúng trong mẫu của bạn hoặc lặp lại chúng trong thay thế của bạn .
Bạn có thể làm điều này bằng cách sử dụng tính năng nhìn của regim của Vim, nhưng nó khá là rắc rối:
:%s/\(myFunction(\)\@<=.*\()\)\@=/foo/
(Tôi thấy cú pháp này khiến tôi quên đi những gì tôi đã cố gắng làm ở nơi đầu tiên.)
Thỉnh thoảng bạn vẫn cần nhìn
Vẫn có những tình huống mà bạn cần nhìn. Sử dụng \zs
và \ze
rất tốt cho các tình huống đơn giản trong đó bạn có một cái gì đó trước khi tiếp theo bằng văn bản để phù hợp với sau đó là một cái gì đó sau . Nhưng nếu nó phức tạp hơn thế, có lẽ bạn sẽ phải tuân theo cú pháp nhìn nặng hơn.
Sự thật thú vị
Mặc dù chúng xấu hơn đáng kể, nhưng vẻ ngoài của Vim mạnh hơn so với PCRE! Chúng hỗ trợ giao diện tiêu cực có độ dài thay đổi, nghĩa là bạn có thể khẳng định rằng một số mẫu có độ dài không được xác định trước không nằm trước trận đấu của bạn.
PCRE không hỗ trợ điều này, vì nó khá tốn kém về mặt tính toán. Đó không phải là mối quan tâm lớn ở Vim, vì các trường hợp sử dụng phổ biến nhất của regex có xu hướng liên quan đến tìm kiếm tương tác trong đó thời gian tính toán gần như không thể chấp nhận được đối với người dùng. Bạn có thể nhận thấy nó nếu nó được sử dụng để làm nổi bật cú pháp, mặc dù.
Chủ đề trợ giúp có liên quan
:help \zs
:help \ze
:help perl-patterns