Ekspresi reguler multi-baris di Visual Studio

87

Apakah ada cara untuk membuat Visual Studio melakukan penggantian regex di beberapa baris (biarkan pertandingan melewati batas garis)? Saya tahu ada banyak editor yang dapat saya gunakan untuk ini, tetapi tampaknya aneh bahwa fitur ini telah ditinggalkan di Visual Studio. Apakah saya melewatkan sesuatu?

Paul Keister
sumber

Jawaban:

24

Gunakan dialog ganti dalam file Ctrl- Shift- Hdan opsi baris tunggal (?s):

(?s)start.*end

menemukan

start
two
three
end

Singleline artinya: setiap file diperlakukan sebagai satu baris, titik .cocok dengan baris baru \n. Kelemahan: Anda harus menggunakan Temukan Semua dan mengganti semua, atau mengganti dengan tangan. Temukan selanjutnya tidak berfungsi.

Untuk dialog non-modal Ctrl- Hdan temukan berikutnya, gunakan (.*\n)*untuk mencocokkan sejumlah baris:

start(.*\n)*.*end

Apa pun itu, Anda dapat mengganti temuan Anda dengan beberapa baris dengan menyisipkan \n.

Stephan Stamm
sumber
ini berfungsi tetapi Anda ingin tanda tanya tambahan (sebelum end) jadi tidak serakah. yaitu:start(.*\n)*.*?end
Pria CAD
4
Versi serakah mencocokkan sebanyak mungkin karakter antara startdan end. Jika Anda ingin menemukan versi berikutnya, endgunakan versi non-serakah:, (?s)start.*?endatau start(.*\n)*?.*?end.
Stephan Stamm
Catatan untuk calon pengguna: tidak berfungsi sejak Visual Studio 2013. Lihat jawaban Giles Roberts.
relative_random
@relatives_random: Apakah Anda kesulitan menggunakan (?s)?
Stephan Stamm
Ya saya lakukan. Apakah masih berfungsi untuk Anda pada versi VS yang lebih baru?
relative_random
72

Ekspresi reguler telah berubah di Visual Studio 2013 . https://msdn.microsoft.com/en-us/library/2k3te2cs(v=vs.120).aspx

Untuk mencocokkan ekspresi pada dua baris, kodenya sekarang menjadi:

StartOfExpression.*\r?\n.*EndOfExpression

Giles Roberts
sumber
Terima kasih, ini bekerja dengan sempurna, di </label>.*\r?\n.*<divmana \r?\ncarriage_return-new_line yang jelas dan .*untuk mencocokkan kemungkinan tab / spasi
Sam
Saya mendapatkan pesan kesalahan "Literal '\ n' saat ini tidak didukung"
ELI7VH
@ ELI7VH Saya tidak dapat meniru kesalahan Anda. Versi Visual Studio apa yang Anda gunakan?
Giles Roberts
25

Ini berfungsi hari ini di Visual Studio 2012:

fooPatternToStart.*(.*\n)+?.*barPatternToEnd

Lihat bagaimana (.*\n)+?bagian melakukan pencocokan di beberapa baris, tidak serakah.
fooPatternToStartadalah beberapa pola regex di garis awal Anda, sedangkan barPatternToEndpola Anda ditemukan di garis lain di bawah, mungkin banyak garis di bawah ...

Contoh ditemukan di sini .

Sederhana dan efektif :)

Catatan: sebelum VS2012, pola yang berhasil adalah:fooPatternToStart.(.\n)+@.*barPatternToEnd

Woo hoo
sumber
4
note visual studio 2012 menggunakan mesin regex yang sama untuk temukan / ganti seperti di dalam kode, jadi yang di atas menjadi: fooPatternToStart. * (. * \ n) *?. * barPatternToEnd
Brent
@Brent: memang, versi VSTO yang lebih baru telah memperbaiki masalah itu.
woohoo
bagaimana jika saya ingin mencari teks khusus di antara start dan stop? seperti ini? : Edit: sprintf.*(.*\n)+?.*log.*(.*\n)+?.*__func__berfungsi untuk mencari logantara sprintfdan __func__, terima kasih! Tho .. tampaknya melihat ke tak terhingga untuk itu .. jika hanya ada cara untuk membatasi jumlah baris
Gizmo
19

Catatan: jawaban ini menggunakan sintaks regex yang digunakan dalam Visual Studio hingga dan termasuk VS 2012. Di VS 2013 dan yang lebih baru, sintaks regex telah berubah.

Anda bisa memasukkannya ke \ndalam ekspresi. Sebagai contoh, berikut adalah regex yang saya gunakan untuk "membersihkan" skrip SQL yang dibuat secara otomatis dari apa pun yang bukan prosedur tersimpan (ini akan cocok dengan blok teks yang dimulai dengan baris yang berisi "Objek:" diikuti oleh sesuatu yang bukan "StoredProcedure", lalu mencocokkan baris berikut hingga baris terdiri dari kata "GO"):

/\*+ Object\::b:b~(StoredProcedure)(.*\n)#GO\n
Fredrik Mörk
sumber
Catatan: Terminator baris bergantung pada format file, jadi gunakan hanya \ n untuk teks gaya Unix, \ r untuk teks gaya Mac, atau \ r \ n untuk teks gaya windows.
James Wilkins
2
Catatan II: pastikan Anda tidak mencentang "Cocokkan seluruh kata", jika tidak, ini tidak akan berfungsi!
Ed Graham
1
Bisakah Anda menambahkan catatan yang mengatakan bahwa jawaban ini hanya berlaku untuk Visual Studio 2012 dan yang lebih lama?
Giles Roberts
3

Anda mungkin perlu menggunakan \ r \ n di akhir ekspresi Anda.

Keng
sumber
1

Multi-baris non-serakah pengambilan karakter apa pun, Visual Studio 2013+:

.*?\r?\n.*?

Versi serakah dalam jawaban Giles Roberts.

meong
sumber
0

Untuk semua orang yang datang ke sini saat mencari VS Code, saya menggunakan ini untuk mencocokkan apa pun dari scriptmana saja dengan 2 baris baru (baris baru dikecualikan):

script(.|\n)+?(?=\n\n)

mengganti scriptdan \n\nmencocokkan segala sesuatu di antara mereka.

Ali Tou
sumber