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.

hackerhasid
sumber

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+)
Ceria
sumber
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.

CrnaStena
sumber
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 */
Hrvoje Golcic
sumber
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

zeeawan
sumber
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.

Andreas Haferburg
sumber
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
1

Melihat artikel Sublime Text Documentation tidak resmi di Search and Replace , sepertinya +(.+)adalah kelompok tangkap yang Anda inginkan ... tapi saya pribadi menggunakan (.*)dan itu bekerja dengan baik. Untuk MENGGANTI dengan cara yang Anda katakan, Anda mungkin menyukai percakapan ini di forum , khususnya posting ini yang mengatakan untuk hanya menggunakan $1menggunakan grup yang ditangkap pertama.

Dan karena gambar lebih baik daripada kata-kata ...

Sebelum: sebelum menemukan / mengganti

Setelah: setelah menemukan / mengganti

Blairg23
sumber