Có vẻ như regex khó chịu của bạn không đủ khó chịu ... :-)
Phần tìm kiếm
Tìm kiếm sẽ phải được thay đổi thành này:
^Hide\(\(\(Show\|Hide\)\@!\_.\)*\)SetFontSize 28
Điều này bao gồm khá nhiều điều không phổ biến và rất nhiều dấu ngoặc đơn ... Hãy xem những gì chúng ta có trong đó:
Caret ( ^
)
Các dấu mũ được sử dụng để có nghĩa là bắt đầu của dòng. Tôi nghĩ rằng chúng ta đã quen thuộc với điều này.
Một điểm quan trọng, ^
không hoạt động trừ khi là nhân vật đầu tiên trong mẫu của bạn. Sau khi nó được thực hiện nguyên văn. Để bao gồm một dòng bắt đầu trong biểu thức của bạn, bạn cần sử dụng \_^
. Tuy nhiên, trong tình huống của chúng tôi, chúng tôi không cần điều đó.
(Có một hiện tượng tương tự với $
và \_$
)
Dấu ngoặc đầu tiên và cuối cùng ( \( ... \)
)
Dấu ngoặc đầu tiên và cuối cùng được sử dụng riêng , điều đó có nghĩa là nó sẽ lấy bất cứ thứ gì xuất hiện bên trong và đặt nó trong tham số \1
. Bạn đã sử dụng nó trong regex của riêng bạn, vì vậy tôi sẽ cho rằng bạn cũng quen với cái này.
Bộ dấu ngoặc đơn thứ hai
Như bạn có thể nhận thấy, có một bộ dấu ngoặc đơn thứ hai theo sau là dấu hoa thị \( ... \)*
. Điều này có nghĩa là chúng tôi đang tìm kiếm bất cứ điều gì phù hợp với bất kỳ số lần. Đây là cách thông thường để sử dụng dấu hoa thị, vì vậy bạn nên làm quen với nó.
Bộ dấu ngoặc đơn thứ ba, HOẶC và \_.
Vâng, thực sự có ba dấu ngoặc đơn trước từ này Show
. Bộ cuối cùng này là cần thiết vì hai lý do: \|
và sau đây @!
.
Liên quan đến hoạt động OR, bạn đã quen thuộc với nó.
Show\|Hide or Hide\|Show
Thứ tự không quan trọng ở đây. Điều \
cần thiết ở phía trước |
để làm việc trong vim.
Dấu ngoặc quanh biểu thức này cho phép chúng ta theo dõi biểu thức bằng một cái gì đó . Đây @!
.
\(Show\|Hide\)@!
Cái này ít quen thuộc hơn nhiều. Nó có nghĩa là nếu không phù hợp . Tuy nhiên, việc sử dụng này không phải là rất dễ dàng, nhưng bạn cần tuân theo biểu thức đó với những gì bạn muốn trích xuất không phù hợp với biểu thức đã nói. Đây là lý do tại sao chúng ta có \_.
đằng sau mô hình đó.
Các \_.
phương tiện phù hợp với bất cứ điều gì. Trái ngược với chính .
nó, không phù hợp với \n
nhân vật. Nói cách khác, chúng tôi khớp bất kỳ ký tự nào trên bất kỳ số dòng nào trừ khi nó khớp Show
hoặc Hide
.
Lưu ý rằng dấu ngoặc đơn xung quanh biểu thức đó cũng quan trọng như dấu hoa thị, vì vậy toàn bộ điều này thực sự là điều làm cho nó hoạt động:
\(\(Show\|Hide\)@!\_.\)*
aka đối sánh số tiền lên đến tiếp theo Show
hoặc Hide
ký tự (lưu ý rằng nó cũng sẽ phù hợp với Showing
, Shower
, HideMe
, vv bạn sẽ có thể sử dụng \<
và \>
nếu nó là cần thiết để phù hợp với lời chính xác.)
Lưu ý bên: để tìm kiếm trên nhiều dòng, cũng có thể sử dụng \n
ký tự trong mẫu. Tuy nhiên, nó không linh hoạt hơn \_.
mẫu.
SetFontSize 28
Bây giờ phần phải bao gồm SetFontSize 28
là tốt. Giống như bạn đã có trong regex của bạn. Nếu không SetFontSize 28
xuất hiện trong phần đó, hãy thử tìm kiếm lại trong phần tiếp theo.
Do sự phủ định ở trên (trận đấu ngoại trừ Show
hoặc Hide
), tìm kiếm không bị rò rỉ sang phần tiếp theo, có nguy cơ làm hỏng nó.
Bộ phận thay thế
Sự thay thế giống như bạn đã có:
.../Hide\1SetFontSize 18/
Chúng tôi sử dụng dấu ngoặc đơn trong Tìm kiếm để \1
công việc như mong đợi.
Hoàn thành Tìm kiếm và Thay thế
Các mô hình kết quả như thế này:
:%s/^Hide\(\(\(Show\|Hide\)@!\_.\)*\)SetFontSize 28/Hide\1SetFontSize 18/
Các \(Show\|Hide\)
nên bao gồm tất cả các khả năng tiêu đề .
Nguồn
Regex để khớp với bất kỳ ký tự nào, kể cả dòng mới ( \_.\{-}
)
Tìm kiếm các dòng không chứa mẫu và các tìm kiếm hữu ích khác ( @!
)
Tài liệu Vim: mẫu ( \_^
)
Hide
khối đều có mộtSetFontSize
dòng (bất cứ giá trị nào)? Nếu vậy, bạn có thể sử dụng:%s/Hide\_.\{-\}SetFontSize \zs28/18/