En el sitio de Code Golf Stack Exchange hoy, encontré esta respuesta en Clojure a la pregunta "Obtener todos los enlaces en una página web".
(->> (slurp "http://www.stroustrup.com")
(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+"))
Sin la macro elegante, es solo esto:
(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+" (slurp "http://www.stroustrup.com"))
Esto devuelve la lista:
("http://www.morganstanley.com/" "http://www.cs.columbia.edu/" "http://www.cse.tamu.edu" ...)
¿Puedo hacer algo similar en Emacs Lisp?
Tal vez una función como (re-seq regexp (buffer-string))
esa regresa '(firstmatch secondmatch thirdmatch ...)
?
elisp
regular-expressions
niñera
fuente
fuente
M-x occur
hace, pero buscaría más funciones de bajo nivel para hacerlo.occur
. Tendré que mirar a través de su fuente.s.el
, pero tal vez hay más por ahí. Aquí: github.com/magnars/s.el#s-match-strings-all-regex-string ¿qué tal esto?Respuestas:
Así es como puede hacerlo en función de las cadenas, según lo solicitado.
fuente
(re-seq "^.*$" "")
. Regexp válido, cadena válida, pero nunca termina.Probablemente valga la pena señalar que invocar
occur
con el argumento universal hace que llene el*Occur*
búfer solo con coincidencias, sin nombres de archivo, números de línea o información de encabezado. Cuando se combina con un grupo de captura, esto permite extraer el patrón que se desee.Por ejemplo,
C-u M-x occur
seguido de\"\(.*\)\"
preguntará al usuario qué grupo de captura debe recopilar (predeterminado\1
) y luego colocará el contenido de cada cadena citada en el*Occur*
búfer.fuente
Tengo una respuesta de emacs lisp a esa pregunta publicada: /codegolf//a/44319/18848
Usando la misma estructura (while (search) (print)) podría modificarla en una función para insertar coincidencias en un búfer en una lista y devolverla así:
fuente
match-string
conmatch-string-no-properties
lo que el resaltado de sintaxis no se extrae. Es posible que desee pasar unregexp-group-index
uso para poder elegir qué texto se almacena. Además de invertir el orden de búsqueda (la lista actual es la última a la primera). Vea esta respuesta que incluye una versión modificada emacs.stackexchange.com/a/38752/2418Usar
s.el
esto hubiera sido más corto, pero, desafortunadamente, da demasiadas coincidencias:Si esto está bien (la expresión regular para las URL no es perfecta de todos modos), esto podría ser más corto, y si no, entonces no creo que pueda hacerlo más corto que la respuesta de Alan Shutko.
fuente
Permítanme mencionar por qué creo que esto no se implementa en el núcleo. Simplemente por razones de eficiencia: no hay necesidad de copiar, crear listas, pasarlas y recolectar basura. En su lugar, almacene la cadena completa como el búfer y opere con límites de coincidencia de enteros. Así es como
occur
funciona, por ejemplo: coincide con una cadena a la vez e inserta la coincidencia*occur*
. No coincide con todas las cadenas a la vez, hacerlas en la lista, hacer un bucle en la lista para insertar*occur*
y recolectar basura de la lista y sus cadenas.Al igual que no escribirías
(do (def x 1) (def x (+ 2 x)))
en Clojure, por defecto no deberías intentar que Elisp se comporte como un lenguaje funcional. Me encantaría si lo fuera, pero tenemos que cumplir con lo que tenemos en este momento.fuente
Si se me permite un enchufe, eche un vistazo a mi biblioteca "m-buffer".
Devuelve una lista de marcadores con los que coincide
foo
.fuente