Apakah elisp memiliki regexp literal?


14

Banyaknya backslash yang dibutuhkan regexps saya cukup gila. Apakah Elisp memiliki regexp literal, jadi saya dapat menulis sesuatu seperti

rx"some\(regexp\)"

dari pada

"some\\(regexp\\)"

Emacs menyoroti beberapa konstruksi regexp seperti \\|, \\(, dan \\). Sayangnya, dalam banyak tema ini tidak terlihat. Anda dapat mengganti font-lock-regexp-grouping-backslashdan font-lock-regexp-grouping-constructmembuat ini lebih berbeda.
Lindydancer

2
Saya telah membuat tambalan untuk mendukung literal string baku tetapi para pengembang tidak tertarik.
rajutan

1
Anda selalu dapat mengubah bagaimana hal-hal ditampilkan, seperti dalam posting blog ini oleh @ abo-abo: oremacs.com/2015/01/11/pretty-elisp-regex
glucas

@knarf sangat memalukan bahwa Stefan tidak tertarik pada dukungan string mentah, karena string mentah akan menjadi pelengkap sintaksis regexp baru (yang saya akan mendukung), bukan pengganti.
nosefrog

Jawaban:


13

Salah satu opsi adalah menggunakan rxmakro untuk membangun ekspresi Anda menggunakan sexps.

Teladan Anda menjadi (rx "some" (group "regexp"))

Berikut adalah beberapa contoh lagi dari bagian komentar di rx.el, untuk mendapatkan ide tentang cara rxkerjanya:

Ini ^;;\\s-*\n\\|^\n menjadi

(rx (or (and line-start ";;" (0+ space) ?\n)
        (and line-start ?\n)))

Ini [ \t\n]*:\\([^:]+\\|$\\) menjadi

(rx (and (zero-or-more (in " \t\n")) ":"
         (submatch (or line-end (one-or-more (not (any ?:)))))))

2
Terima kasih atas edit @knarf! Saya menggunakan ponsel saya dan tidak ingin memberi contoh bahwa saya mungkin salah. :-)
glucas

Kami sebenarnya dalam proses memindahkan banyak skrip yang menggunakan banyak pencarian regex dan ganti dari perl ke elisp karena rxsintaksisnya, yang membuatnya lebih mudah untuk dipelihara. Imho, untuk kasus serupa, sintaks rx dengan sendirinya membuat elisp pengganti yang layak untuk perl python, ruby, dll. Terima kasih.
gsl

7

Tidak, itu tidak memiliki regexp literal, tetapi banyak yang menemukan pcre2el sebagai alternatif yang bermanfaat.

Khusus menggunakannya dari elisp seperti ini:

(rxt-pcre-to-elisp "(abc|def)\\w+\\d+")
   ;; => "\\(\\(?:abc\\|def\\)\\)[_[:alnum:]]+[[:digit:]]+"

Itu masih mengharuskan Anda untuk menggandakan backslash Anda. Anda hanya tidak perlu cukup banyak untuk regexp rata-rata.
cjm
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.