Sepertinya regex jahat Anda tidak cukup jahat ... :-)
Bagian Pencarian
Pencarian harus diubah menjadi ini:
^Hide\(\(\(Show\|Hide\)\@!\_.\)*\)SetFontSize 28
Ini termasuk beberapa hal yang tidak biasa dan banyak tanda kurung ... Mari kita lihat apa yang kita miliki di sana:
The Caret ( ^
)
Tanda sisipan digunakan untuk berarti awal dari garis. Saya pikir kita sudah akrab dengan yang ini.
Poin penting, ^
tidak berfungsi kecuali sebagai karakter pertama dalam pola Anda. Setelah itu diambil kata demi kata. Untuk memasukkan awal baris dalam ekspresi Anda, Anda perlu menggunakan \_^
. Namun, dalam situasi kami, kami tidak membutuhkan itu.
(Ada fenomena serupa dengan $
dan \_$
)
Tanda kurung pertama dan terakhir ( \( ... \)
)
Tanda kurung pertama dan terakhir digunakan sendiri yang artinya akan mengambil apa pun yang muncul di dalamnya dan mengaturnya dalam parameter \1
. Anda sudah menggunakannya di regex Anda sendiri, jadi saya akan menganggap Anda juga terbiasa dengan yang ini.
Set kurung kedua
Seperti yang Anda perhatikan, ada tanda kurung kedua yang diikuti oleh tanda bintang \( ... \)*
. Ini berarti kami mencari apa pun yang cocok dengan beberapa kali. Ini adalah cara biasa menggunakan tanda bintang sehingga Anda harus terbiasa dengannya.
Set kurung ketiga, OR, dan \_.
Ya, sebenarnya ada tiga tanda kurung sebelum kata Show
. Set terakhir ini diperlukan karena dua alasan: \|
dan berikut ini @!
.
Sehubungan dengan operasi ATAU, Anda harus sudah terbiasa dengannya.
Show\|Hide or Hide\|Show
Urutannya tidak penting di sini. Ini \
diperlukan di depan |
untuk bekerja di vim.
Tanda kurung di sekitar ungkapan ini memungkinkan kita untuk mengikuti ekspresi dengan sesuatu . Di sini @!
.
\(Show\|Hide\)@!
Yang ini kurang familiar. Artinya kalau tidak cocok . Penggunaan ini tidak mudah, tetapi Anda harus mengikuti ungkapan itu dengan apa yang ingin Anda ekstrak yang tidak cocok dengan ungkapan tersebut. Inilah mengapa kita memiliki di \_.
balik pola itu.
The \_.
berarti cocok sesuatu apapun. Berlawanan dengan .
karakternya sendiri, yang tidak cocok dengan \n
karakternya. Dengan kata lain, kami mencocokkan karakter apa pun pada sejumlah baris kecuali jika cocok Show
atau Hide
.
Perhatikan bahwa tanda kurung di sekitar ungkapan itu juga penting seperti tanda bintang, jadi semua ini yang membuatnya bekerja:
\(\(Show\|Hide\)@!\_.\)*
alias mencocokkan berapa pun sampai ke yang berikutnya Show
atau Hide
karakter (catatan bahwa hal itu juga akan cocok Showing
, Shower
, HideMe
, dll Anda harus dapat menggunakan \<
dan \>
jika perlu untuk mencocokkan kata dengan tepat.)
Catatan Samping: untuk mencari di banyak baris, juga dimungkinkan untuk menggunakan \n
karakter dalam pola. Namun, itu tidak serbaguna daripada \_.
polanya.
SetFontSize 28
Sekarang bagian ini juga harus disertakan SetFontSize 28
. Sama seperti yang Anda miliki di regex Anda. Jika tidak ada yang SetFontSize 28
muncul di bagian itu, coba cari lagi di bagian selanjutnya.
Karena negasi di atas (kecocokan kecuali Show
atau Hide
) pencarian tidak bocor ke bagian berikutnya, mengambil risiko mengacaukannya.
Bagian Penggantian
Penggantinya sama seperti yang Anda miliki:
.../Hide\1SetFontSize 18/
Kami menggunakan tanda kurung dalam Pencarian sehingga \1
berfungsi seperti yang diharapkan.
Cari dan Ganti Lengkap
Pola yang dihasilkan seperti ini:
:%s/^Hide\(\(\(Show\|Hide\)@!\_.\)*\)SetFontSize 28/Hide\1SetFontSize 18/
The \(Show\|Hide\)
harus mencakup semua kemungkinan header .
Sumber
Regex untuk mencocokkan karakter apa pun termasuk baris baru ( \_.\{-}
)
Cari baris yang tidak mengandung pola dan pencarian bermanfaat lainnya ( @!
)
Dokumentasi Vim: pattern ( \_^
)
Hide
blok memilikiSetFontSize
garis (berapapun nilainya)? Jika demikian, Anda dapat menggunakan:%s/Hide\_.\{-\}SetFontSize \zs28/18/