Bagaimana Anda mereferensikan grup tangkapan dengan regex find dan replace di Visual Studio 2012, 2013, 2015, dan VS Code

255

Saya menyadari ada banyak pertanyaan tentang hal ini, tetapi tidak ada yang saya temukan yang secara spesifik merujuk pada versi VS yang mereka maksud. Dengan informasi penting yang kurang, saya masih tidak berhasil menggunakan jawaban yang saya temukan. Yang paling umum adalah

  • Dikelilingi dengan {}, tangkapan layar dengan \ 1, \ 2, \ n

Namun, itu tampaknya menjadi metode lama dalam melakukan pencarian dan penggantian regex di Visual Studio, dan itu tidak bekerja di VS 2012.

SgtPooki
sumber
1
Ini tidak terlalu sulit ditemukan dalam bantuan: dalam dialog Cari / Ganti, F1; di awal Menemukan dan Mengganti Teks ada tautan ke Menggunakan Ekspresi Reguler di VS ; di sana tip ke-2 merujuk Anda ke Substitusi dalam Ekspresi Reguler ; itu memberi Anda dasar-dasar dan mengatakan ada lebih detail di bawah Pengganti Kelompok Bernomor dan Pengganti Kelompok Bernama .
PJTraill
2
@PJTraill senang mengetahui bahwa mereka membuatnya lebih mudah untuk menjawab pertanyaan untuk versi 2012 mereka antara tahun 2013 dan 2015. Namun menurut suara, saya pikir cukup jelas bahwa masih tidak "tidak terlalu sulit" untuk menemukan bantuan. IMO: Jika lebih mudah untuk mencari dan memilih artikel stack overflow daripada menggunakan find, replace, capture tanpa mencari bantuan sama sekali, maka itu jauh lebih sulit dari yang seharusnya.
SgtPooki
Satu hal yang menggangguku tentang MSVS 2012/3 adalah dua dialog Pencarian / Ganti yang berbeda, khususnya dialog yang lebih kecil (Ctrl-H), tempat saya menyimpannya secara tidak sengaja (dengan penekanan tombol mungkin berarti sesuatu yang lain di tempat lain) mengubah cakupan pencarian . Tetapi yang ingin saya sampaikan adalah bahwa dialog yang lebih besar (Ctrl-Shift-H) memiliki tombol setelah bidang Temukan dan Ganti yang memberi Anda daftar kemungkinan yang lebih penting, termasuk apa yang Anda cari - jadi Anda tidak perlu Butuh bantuan! Saya kira banyak orang yang tidak melihat tombol atau mendarat di dialog Ctrl-H dan tidak bisa melihatnya.
PJTraill
Saya setuju bahwa bantuannya sedikit repot untuk ditemukan; Saya curiga mereka mengutamakan pencarian teks biasa. Maksud saya lebih dari itu, jika seseorang tahu atau berasumsi pasti ada di sana, ia dapat menemukannya dengan mudah; semua sering saya ikuti rute itu, karena saya lebih suka menggunakan dokumentasi kanonik setelah saya bisa menemukannya. Aku tidak bermaksud terdengar meremehkan; Saya rasa itu "terlalu keras" dan "tidak terlalu keras" - mereka tidak bertentangan jika Anda melihat "tidak terlalu" sebagai kualifikasi "keras" dan menambahkan jawaban untuk "keras untuk apa?".
PJTraill
Saya "tahu" bahwa penandaan REGEXP menggunakan '()', Saya membaca dokumentasinya, dan itu tidak berfungsi ... jadi saya datang ke sini untuk memastikan ... kemudian saya melakukan beberapa eksperimen lagi, dan itu berhasil. Jadi IMHO dokumentasi MSDN harus sangat jelas bahwa () digunakan untuk "menandai" suatu ekspresi, bagi kita yang harus mempelajari tata nama "tag" VS6 lama. Alangkah baiknya jika mereka bisa menggunakan nomenklatur yang sama. Kelompok bernomor ... hanya tidak menjalankan sinapsis cukup baik IMHO.
Ross Youngblood

Jawaban:

356

Untuk menemukan dan mengganti VS 2012 dan VS 2015 Anda melakukan hal berikut:

Contoh (terima kasih untuk syonip)

Di opsi temukan, pastikan 'gunakan ekspresi reguler' dicentang, dan tuliskan berikut ini sebagai teks untuk menemukan:

_platformActions.InstallApp\((.+)\)

Dan berikut ini sebagai teks untuk menggantinya dengan:

this.Platform().App($1).Install()

Catatan: Seperti yang ditunjukkan oleh SLaks dalam komentar di bawah ini, perubahan dalam sintaksis regex disebabkan oleh peralihan VS2012 ke mesin standar .Net regex.

Catatan: Komentator lain menunjukkan bahwa ini juga berfungsi dalam Visual Studio Code (vscode)

SgtPooki
sumber
10
Agar lebih umum, VS2012 sekarang menggunakan mesin regex .Net standar.
SLaks
4
Apakah kamu tidak perlu melarikan diri dari periode char antara _platformActionsdan InstallApp?
rory.ap
Memikirkan itu sekarang, itu masuk akal. Saya belum mengujinya. Jangan ragu untuk membuang hasil edit di sana.
SgtPooki
1
Berakhir saya menggunakan dinamai numerik tampaknya tidak bekerja untuk saya setidaknya. (?<rval>.+)dalam pencarian dan ganti${rval}
Mark Schultheiss
2
Beberapa bantuan tambahan: jika Anda ingin mengganti benda (. *) Dengan benda $ 18 (menambahkan '8' langsung setelah penangkapan) Anda harus menggunakan benda $ {1} 8
Luc Bloom
17

Untuk menambahkan contoh ini, berikut adalah sesuatu yang harus saya lakukan dalam kode saya:

Menemukan apa:

_platformActions.InstallApp\((.+)\)

Ubah dengan:

this.Platform().App($1).Install()

Ini menggantikan semua panggilan ke InstallApp (x), dengan this.Platform (). App (x) .Install ().

* Jangan lupa menandai "Gunakan ekspresi reguler" di opsi Temukan

Syonip
sumber
10

Jika Anda ingin bekerja dengan menggunakan nama grup (menggunakan sampel yang sama seperti di atas):

Menemukan apa:

_platformActions\.InstallApp\((?<mygroupname>.+)\)

Ubah dengan:

this.Platform().App(${mygroupname}).Install()
Yepeekai
sumber
9

Untuk meningkatkan jawaban di atas: Anda harus mengganti

_platformActions.InstallApp\((.+)\)

dengan

this.Platform().App(${1}).Install()

Pikirkan $ {1} jika Anda ingin menambahkan nomor di belakang tangkapan. $18akan mencoba untuk memasukkan tangkapan pencarian ke-18, bukan yang pertama dengan 8ditambahkan.

Luc Bloom
sumber