Referensi balik RegEx di IntelliJ

129

Saya ingin menggunakan fitur temukan dan ganti IntelliJ untuk melakukan transformasi berikut:

// Replace this
model.put('foo', 'bar')
// With this
model['foo'] = bar

Saya sudah mencoba yang berikut ini:

Teks untuk ditemukan: model.put\((.*),(.*)\) Ganti dengan:model\[\\1\] = \\2

Tapi Intellij tampaknya tidak mengenali \\1dan \\2sebagai referensi. Saya juga mencoba satu tebasan, tetapi itu tidak berhasil.

Dónal
sumber

Jawaban:

196

IntelliJ menggunakan $1untuk referensi pengganti .

Dari bantuan IntelliJ:

Untuk informasi lebih lanjut tentang ekspresi reguler dan sintaksisnya, rujuk ke dokumentasi untuk java.util.regex. Referensi balik harus memiliki format $ n, daripada \ n.

Steve K.
sumber
15
Sepertinya "\" tidak diperlukan: jetbrains.com/idea/help/… . Juga, bagi saya ini hanya berfungsi jika saya secara eksplisit mengelilingi grup saya dengan "()", kalau tidak, saya tidak dapat merujuknya nanti. Mis: cari (foo)ganti:$1bar
Ghedeon
@Ghedeon: Anda mungkin harus menambahkan komentar Anda sebagai jawaban atau ke jawaban yang ada. Saran Anda untuk memasukkan ekspresi ke dalam () adalah yang berhasil bagi saya.
mindreader
Memberi +1 sedikit informasi yang memecahkan masalah terkait saya: saya mengganti pembungkus tanda kutip-plus di sekitar variabel dengan pembungkus keriting dolar, yaitu, '+ var +'ke ${var}dalam beberapa string template dan tidak bisa mencari tahu mengapa intellij tidak akan menyelesaikan penggantian. ternyata $harus lolos dalam penggantian.
worc
13

Singkatnya, Anda harus menggunakan $1untuk $nuntuk penggantian backreferences. \1sintaks hanya untuk referensi-kembali dalam pencarian.

Di IntelliJ 2016, dokumentasi dalam aplikasi menyesatkan. Berikut adalah kutipan yang lebih baik dari dokumen lengkap:

Jika Anda perlu merujuk substring yang cocok di suatu tempat di luar ekspresi reguler saat ini (misalnya, dalam ekspresi reguler lain sebagai string pengganti), Anda dapat mengambilnya menggunakan tanda dolar ($ num, di mana num = 1..n).

Sumber: sintaks ekspresi reguler, Tips & Trik 2016.1

Barett
sumber
2

Bantuan kontekstual dalam-produk untuk regex di Idea 9.0 (dan mungkin versi lain) tampaknya salah. Ini menyatakan ini:

  Referensi kembali
  \ n
  Apapun yang ditangkap grup penangkap yang cocok

Tetapi ternyata, seperti yang disebutkan dalam jawaban sebelumnya dan pengalaman saya, itu benar-benar \ $ n untuk referensi belakang, bukan \ n

Anda mendapatkan bantuan kontekstual ini dengan mengeklik tautan '[Bantuan]' di sebelah opsi radio "Ekspresi reguler" pada kotak dialog "Ganti Teks"

Lembah kecil
sumber
0

IntelliJ IDEA / Referensi / Referensi Sintaks Ekspresi Reguler


Cocok dengan subekspresi dan ingat pertandingan. Jika Anda perlu menggunakan substring yang cocok dalam ekspresi reguler yang sama, Anda dapat mengambilnya menggunakan referensi-kembali (\ num, di mana num = 1..n). Jika Anda perlu merujuk substring yang cocok di suatu tempat di luar ekspresi reguler saat ini (misalnya, dalam ekspresi reguler lain di bidang Penggantian), Anda dapat mengambilnya menggunakan tanda dolar ($ num, di mana num = 1..n). Jika Anda perlu memasukkan karakter tanda kurung ke dalam subekspresi, gunakan "(" atau ")".

Cong De Peng
sumber
Saya menemukan hal yang sama di sini ; Namun, saya akhirnya berhasil menggunakan $ 1, tanpa backslash.
Joe Tricarico