Di situs Code Golf Stack Exchange hari ini, saya menemukan jawaban ini di Clojure untuk pertanyaan "Dapatkan semua tautan di laman web".
(->> (slurp "http://www.stroustrup.com")
(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+"))
Tanpa makro mewah, hanya ini:
(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+" (slurp "http://www.stroustrup.com"))
Ini mengembalikan daftar:
("http://www.morganstanley.com/" "http://www.cs.columbia.edu/" "http://www.cse.tamu.edu" ...)
Bisakah saya melakukan hal serupa di Emacs Lisp?
Mungkin fungsi seperti (re-seq regexp (buffer-string))
itu kembali '(firstmatch secondmatch thirdmatch ...)
?
elisp
regular-expressions
pengasuh
sumber
sumber
M-x occur
dilakukan, tetapi saya akan mencari ke dalam untuk fungsi yang lebih rendah untuk melakukannya.occur
. Saya harus memeriksa sumbernya.s.el
, tetapi mungkin ada lebih banyak di luar sana. Di sini: github.com/magnars/s.el#s-match-strings-all-regex-string bagaimana dengan ini?Jawaban:
Inilah cara Anda dapat melakukannya berdasarkan string, seperti yang diminta.
sumber
(re-seq "^.*$" "")
. Regexp valid, string yang valid, tetapi tidak pernah berakhir.Mungkin perlu dicatat bahwa menggunakan
occur
argumen universal menyebabkannya mengisi*Occur*
buffer hanya dengan kecocokan - tanpa nama file, nomor baris, atau informasi header. Ketika dikombinasikan dengan kelompok tangkap, ini memungkinkan seseorang untuk mengekstrak pola apa pun yang diinginkan.Misalnya,
C-u M-x occur
diikuti oleh\"\(.*\)\"
akan meminta pengguna untuk mengumpulkan kelompok yang mana (default\1
), dan kemudian menempatkan konten setiap string yang dikutip ke dalam*Occur*
buffer.sumber
Saya punya jawaban emacs lisp untuk pertanyaan yang diposting: /codegolf//a/44319/18848
Dengan menggunakan struktur (sementara (pencarian) (cetak)) yang sama, Anda dapat memodifikasinya menjadi fungsi untuk mendorong kecocokan dalam buffer ke daftar dan mengembalikannya seperti ini:
sumber
match-string
dengan itumatch-string-no-properties
sehingga sintaks highlight tidak diekstraksi. Anda mungkin ingin meneruskanregexp-group-index
penggunaan agar Anda dapat memilih teks mana yang disimpan. Serta membalikkan urutan pencarian (daftar saat ini adalah yang terakhir ke yang pertama). Lihat jawaban ini yang mencakup versi modifikasi emacs.stackexchange.com/a/38752/2418Menggunakan
s.el
ini akan lebih pendek, tapi, sayangnya, ini memberikan terlalu banyak kecocokan:Jika ini ok (regex untuk URL tidak sempurna), ini mungkin lebih pendek, dan jika tidak, maka saya tidak berpikir saya bisa membuatnya lebih pendek dari jawaban Alan Shutko.
sumber
Biarkan saya sebutkan mengapa saya pikir ini tidak diterapkan dalam inti. Hanya untuk alasan efisiensi: tidak perlu menyalin, membuat daftar, menyebarkannya dan mengumpulkannya. Alih-alih, simpan seluruh string sebagai buffer, dan beroperasi dengan batas pencocokan integer. Begitulah cara
occur
kerjanya, misalnya: itu cocok satu string pada satu waktu dan memasukkan kecocokan ke dalam*occur*
. Itu tidak cocok dengan semua string sekaligus, membuatnya menjadi daftar, loop pada daftar untuk dimasukkan ke dalam*occur*
dan sampah mengumpulkan daftar dan string-nya.Sama seperti Anda tidak akan menulis
(do (def x 1) (def x (+ 2 x)))
di Clojure, Anda seharusnya tidak mencoba mencoba agar Elisp berperilaku seperti bahasa fungsional. Saya akan senang jika itu, tetapi kita harus membuat sesuai dengan apa yang kita miliki saat ini.sumber
Jika saya mungkin diizinkan plug, lihat perpustakaan "m-buffer" saya.
Mengembalikan daftar penanda yang cocok ke
foo
.sumber