Bagaimana saya bisa berlatih mencari dan mengganti dengan ekspresi reguler secara interaktif di Emacs?

12

Mencari dan mengganti menggunakan ekspresi reguler jelas merupakan alat yang ampuh bagi pengguna Emacs yang secara rutin dapat melakukan tindakan ini. Namun, sebagai pemula Emacs (dan / atau pemrograman), ekspresi reguler perlu dipelajari dan dipraktikkan.

Bisakah saya belajar dan melatih ekspresi reguler secara interaktif di Emacs, mirip dengan tutorial bawaan Emacs? Jika tidak, apa saran lain untuk memanfaatkan Emacs untuk mempraktikkan penggunaan ekspresi reguler untuk mencari dan mengganti?

Felix Z. Hoffmann
sumber
1
Dokumentasi ini agak lengkap: wikemacs.org/wiki/Regexp
Ehvince

Jawaban:

17

Selain itu regexp-builderAnda juga dapat mempertimbangkan visual-regexp untuk memberi Anda umpan balik visual pada penggantian yang sedang berlangsung:

snapshot visual-regexp

immerrr
sumber
3
Atau bahkan anzu, yang melakukan hal yang sama dan lebih banyak.
sanityinc
16

Anda dapat mencoba M-x regexp-builder RETyang merupakan pencocokan ekspresi reguler interaktif, itu tidak buruk

Dave F
sumber
7
Jangan panik ketika C-gtidak keluar seperti yang Anda harapkan. C-c C-qadalah pengikat kunci default untuk keluar dari pembuat regexp ketika Anda selesai berlatih.
nispio
5

Saya menggunakan regexp-builderyang memungkinkan Anda menguji regexps secara interaktif dan mendapatkan umpan balik. Dan tentu saja, begitu saya mulai menggunakannya, saya langsung bertanya pada diri sendiri, "Bagaimana cara memasukkan regexp ini query-replace-regexp?"

Jawaban yang saya pilih adalah fungsi berikut yang didefinisikan pada halaman EmacsWiki ReBuilder .

(defun reb-query-replace (to-string)
  "Replace current RE from point with `query-replace-regexp'."
  (interactive
   (progn (barf-if-buffer-read-only)
          (list (query-replace-read-to (reb-target-binding reb-regexp)
                                       "Query replace"  t))))
  (with-current-buffer reb-target-buffer
    (query-replace-regexp (reb-target-binding reb-regexp) to-string)))

Jadi alur kerja saya adalah:

  1. M-x re-builder
  2. tipe tipe tipe
  3. M-x reb-query-replace
Pak Wacky
sumber
3

Ini bisa menjadi bantuan yang luar biasa ketika belajar menggunakan regexps untuk melihat apa yang cocok dengan bagian regexp mana - khususnya, kelompok regexp. Dan untuk melakukan itu secara interaktif dan bertahap.

Sejalan dengan jawaban @ immerr, pencarian Icicles memiliki sorotan yang serupa untuk waktu yang lama.

masukkan deskripsi gambar di sini

Drew
sumber
3

Anda juga dapat menggunakan helm-regexp yang menampilkan grup regex secara terpisah.

Tu Do
sumber
1

Tidak di dalam emacs, tetapi http://rubular.com/ pada dasarnya adalah regexp-builderdengan cheat-sheet. Anda dapat mengatur contoh dan meminta tautan tersebut melampirkan contoh tersebut. Saya menggunakan ini ketika mendiskusikan regex dengan tim.

Aaron Lee
sumber
1
Apakah Ruby menggunakan Regexp rasa emacs?
nispio
1

Sebagai alternatif untuk Dave F, regexp-builderAnda juga dapat membuat teks arbitrer untuk mempraktikkan pencocokan pola.

Fitur yang paling berguna dari perintah ini adalah bahwa ia akan menyorot kecocokan dalam buffer ketika pola dibuat untuk membantu Anda memastikan kecocokan pola yang tepat.

Menggunakan (query-replace-regexp)( C-M-%) dan membuat ekspresi reguler untuk melakukan penggantian yang Anda inginkan akan membantu Anda berlatih.

Jonathan Leech-Pepin
sumber
Apa manfaatnya tawaran ini untuk seseorang yang ingin "berlatih" ekspresi reguler yang regexp-builderbelum menawarkan? Masalahnya query-replace-regexpadalah bahwa Anda perlu menulis seluruh regexp dan kemudian berkomitmen padanya untuk mencari tahu apa yang cocok. Jika Anda tidak menyukai hasilnya, Anda harus memulai dari awal lagi. regexp-buildermenunjukkan kecocokan dengan cepat yang membuatnya lebih mudah untuk mengubah regexp Anda sampai berfungsi jika Anda tidak tahu apa yang Anda lakukan.
nispio
1
Saya akui itulah sisi buruknya. Namun jika Anda terbiasa dengan ekspresi reguler menggunakan query-replace-regexpakan membuat Anda terbiasa menggunakannya di Emacs secara khusus
Jonathan Leech-Pepin
Mungkin ... tapi sepertinya tidak cocok dengan apa yang diminta OP. "Jika Anda terbiasa dengan ekspresi reguler," maka Anda tidak benar-benar perlu mempelajari ekspresi reguler sama sekali.
nispio
1
OP bertanya bagaimana cara belajar / kapan menggunakannya secara interaktif sebagai pemula Emacs. Mereka mungkin sudah memiliki pengetahuan regexp dari jenis regexp lainnya.
Jonathan Leech-Pepin