Jadi, menggunakan pembangun ekspresi reguler (Mx re-builder), menemukan baris yang diakhiri dengan \ membutuhkan "\\ $", sementara dalam mencari dan mengganti dengan regex, hanya dibutuhkan "\ $". Saya akan mengharapkan pembuat regex untuk membangun ekspresi yang dapat digunakan secara langsung, jadi apa yang menyebabkan perbedaan ini?
elisp
regular-expressions
pengguna2699
sumber
sumber
reb-query-replace
definisi fungsi.Jawaban:
Sebenarnya ada empat
re-builder
opsi sintaks yang berbeda , dan Anda dapat beralih di antaranyaC-cTABDua adalah untuk kompiler regexp sexp-form
rx
dansregex
(tetapi karena yang pertama lebih komprehensif dan hampir seluruhnya kompatibel dengan sintaks, Anda benar-benar dapat mengabaikan sregex kecuali Anda kebetulan bekerja dengan kode lama yang menggunakannya).Dua opsi sintaks lainnya adalah
read
(default) danstring
(yang merupakan sintaks yang Anda gunakan secara interaktif).The
read
sintaks adalah 'kode' sintaks - yaitu seperti yang diakui oleh cadel pembaca - di mana Anda memasukkan regexp sesuai sintaks membaca untuk string :C-hig
(elisp) Syntax for Strings
RETThe
string
sintaks (yang saya selalu dianggap sebagai nama tidak perlu membingungkan dalam konteks ini) adalah sintaks dari string ekspresi reguler yang telah dibaca , dan yang karenanya tidak memiliki karakter melarikan diri diperlukan saat menulis string. Artinya, ini adalah sintaks ekspresi reguler aktual , sama seperti yang Anda gunakan saat Emacs meminta Anda secara interaktif.Jika Anda ingin menggunakan sintaks string secara default, tambahkan berikut ini ke file init Anda, atau gunakan M-x
customize-option
RETreb-re-syntax
RETPerhatikan bahwa Anda dapat beralih antara sintaks baca dan string saat mengedit regexp, tanpa kehilangan data. Anda juga dapat beralih dari bentuk sexp ke membaca / sintaksis string (secara alami; kompilasi sexps menjadi string untuk apa perpustakaan itu), tetapi Anda tidak bisa pergi ke arah lain dan menghasilkan sexp dari string. re-builder mengingat apa itu sexp, jadi Anda tidak kehilangan formulir itu saat Anda mengubah sintaks; tetapi juga tidak bisa diperbarui jika Anda memodifikasi regexp dalam sintaks yang berbeda dan kemudian mengubahnya kembali. Singkatnya, jika Anda membangun regexp sebagai sexp, pastikan Anda hanya mengeditnya saat menggunakan sintaks itu.
Gotcha dengan
rx
dukungannya adalah bahwa itu sebenarnya menggunakanrx-to-string
fungsi, yang tidak cukup identik dengan menggunakanrx
makro dalam kode.rx
menerima sejumlah argumen bentuk yang sewenang-wenang dan memperlakukannya sebagai urutan yang tersirat , sedangkanrx-to-string
hanya menerima bentuk tunggal, dan urutan tingkat atas apa pun harus dibuat eksplisit dengan'(sequence ...)
atau setara.Singkatnya, ketika Anda memasukkan formulir
'(...)
di pembangun ulang, itu diproses sebagai(rx-to-string '(...))
dan tidak(rx ...)
Perhatikan juga bahwa formulir yang tidak valid dapat menyebabkan
re-builder
berhenti memperbarui secara dinamis kecocokan dalam buffer terkait, bahkan setelah formulir dibuat valid lagi. The C-cC-uuntuk mengikatreb-force-update
berguna untuk menyelesaikan situasi ini.Secara default, baris mode menampilkan "RE Builder" saat menggunakan
read
ataustring
sintaks, dan "RE Builder Lisp" saat menggunakanrx
atausregex
sintaks, tetapi tampaknya jauh lebih berguna untuk mengidentifikasi sintaks tertentu yang digunakan (terutama untuk membedakan antararead
danstring
).Jika Anda menginstal
delight
paket dari GNU ELPA, Anda dapat menggunakan yang berikut ini untuk menambahkan indikator sintaks ke baris mode.Ini mengubah nama mode menjadi "Regexp [baca]" dalam
read
sintaks, dan juga untuk yang lain.Atau untuk menyertakan petunjuk untuk
rx
vsrx-to-string
gotcha yang dijelaskan di atas, buat baris mode mengatakan "Regexp [rx-to-string]" saat menggunakanrx
sintaks:sumber