Ganti pencarian ekspresi reguler dalam Sublime Text 2


440

Saya ingin melakukan pencarian ganti dengan ekspresi reguler di Sublime Text 2. Dokumentasi tentang ini agak anemia. Secara khusus, saya ingin melakukan penggantian pada grup, jadi sesuatu seperti mengonversi teks ini:

Hello my name is bob

Dan istilah pencarian ini:

Menemukan apa: my name is (\w)+

Ubah dengan: my name used to be $(1)

Istilah pencarian berfungsi dengan baik tapi saya tidak tahu cara untuk benar-benar melakukan penggantian menggunakan grup regexp.

Jawaban:


584

Biasanya referensi-belakang adalah salah satu $1atau \1(garis miring terbalik) untuk grup tangkapan pertama (kecocokan pertama pola dalam tanda kurung), dan memang Sublime mendukung kedua sintaks. Jadi cobalah:

my name used to be \1

atau

my name used to be $1

Perhatikan juga bahwa pola pengambilan asli Anda:

my name is (\w)+

salah dan hanya akan menangkap huruf terakhir dari nama daripada seluruh nama. Anda harus menggunakan pola berikut untuk mengambil semua huruf dari nama:

my name is (\w+)

15
kecuali, bukan $0?
Skylar Saveland

11
Tidak, $ 0 tidak digunakan sebagai referensi-kembali dalam ekspresi reguler (karena \0sama dengan karakter nol, dan \0ddddigunakan sebagai jalan keluar untuk karakter dengan kode titik ddd). Namun, $0sepertinya digunakan di Sublime2 sebagai "tanda keluar" menurut halaman ini (meskipun saya mengalami kesulitan menemukan cukup contoh untuk mengetahui dengan tepat bagaimana tanda keluar digunakan dalam Sublime2).
Bobulous

3
Tanda keluar $0digunakan dalam Teks 2/3 Sublime untuk menempatkan kursor keluar dari ekspansi potongan. Lebih banyak tentang cuplikan .
jrhorn424

2
$ 0 masih berfungsi untuk mereferensikan seluruh ekspresi dalam Sublime Text 2
sturrockad

2
$0adalah seluruh pertandingan regex; $1adalah grup tangkapan pertama.
Oletha

103

Omong-omong, dalam pertanyaan di atas:

Untuk:

Hello, my name is bob

Temukan bagian:

my name is (\w)+

Dengan mengganti bagian:

my name used to be \1

Akan kembali:

Hello, my name used to be b

Ubah bagian cari ke:

my name is (\w+)

Dan ganti akan menjadi apa yang Anda harapkan:

Hello, my name used to be bob

Meskipun (\ w) + akan cocok dengan "bob", itu bukan pengelompokan yang Anda inginkan untuk penggantian.


52

Penting: Gunakan ( )tanda kurung di string pencarian Anda

Meskipun jawaban sebelumnya benar, ada hal penting yang harus ditekankan! Semua segmen yang cocok dalam string pencarian Anda yang ingin Anda gunakan dalam string pengganti Anda harus ditutup oleh ( )tanda kurung , jika tidak, segmen yang cocok ini tidak akan dapat diakses oleh variabel yang ditentukan seperti $1, $2atau \1, \2dll.

Misalnya kita ingin mengganti 'em' dengan 'px' tetapi mempertahankan nilai digit:

    margin: 10em;  /* Expected: margin: 10px */
    margin: 2em;   /* Expected: margin: 2px */
  • String pengganti: margin: $1pxataumargin: \1px
  • Cari string (BENAR): margin: ([0-9]*)em// dengan tanda kurung
  • String pencarian (INCORRECT): margin: [0-9]*em

CONTOH KASUS YANG BENAR: Menggunakan margin: ([0-9]*)emstring pencarian (dengan tanda kurung). Lampirkan segmen yang cocok yang diinginkan (misalnya $1atau \1) dengan ( )tanda kurung sebagai berikut:

  • Temukan: margin: ([0-9]*)em(dengan tanda kurung)
  • Ganti ke: margin: $1pxataumargin: \1px
  • Hasil:
    margin: 10px;
    margin: 2px;

CONTOH KASUS YANG TIDAK SESUAI: Menggunakan margin: [0-9]*emstring pencarian (tanpa tanda kurung). Pola regex berikut akan cocok dengan garis yang diinginkan tetapi segmen yang cocok tidak akan tersedia dalam string yang diganti sebagai variabel seperti $1atau \1:

  • Temukan: margin: [0-9]*em(tanpa tanda kurung)
  • Ganti ke: margin: $1pxataumargin: \1px
  • Hasil:
    margin: px; /* `$1` is undefined */
    margin: px; /* `$1` is undefined */

1
Terima kasih, jawaban ini benar-benar menunjukkan fakta menarik yang menyelesaikan masalah saya.
Enkk

Terima kasih telah menunjukkannya. Dengan (), saya dapat melakukan penggantian dengan \ 1 di Sublime 3.
Jeffrey

47

Berikut adalah presentasi visual dari jawaban yang disetujui.

masukkan deskripsi gambar di sini


mengapa tidak menemukan $_SESSION[(\w+)? terima kasih
Toni Michel Caubet

Karena $, [, (, dan) adalah karakter khusus sehingga Anda harus melarikan diri dari setiap karakter khusus dengan garis miring terbalik.
zeeawan

25

Perhatikan bahwa jika Anda menggunakan lebih dari 9 grup tangkap Anda harus menggunakan sintaks ${10}.

$10atau \10atau \{10}akan tidak bekerja.


Terima kasih! Ini sangat membantu bagi saya untuk mengganti dan menambahkan nomor ke akhir grup yang ditangkap, misalnya untuk menambahkan 1ke grup penangkapan kedua Anda perlu menggunakan kawat gigi seperti ${2}1; $ 21 merujuk pada kelompok tangkapan ke-21, yang tidak ada.
Eric

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.