Hoje, no site do Code Golf Stack Exchange, encontrei esta resposta no Clojure para a pergunta "Obter todos os links em uma página da web".
(->> (slurp "http://www.stroustrup.com")
(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+"))
Sem a macro sofisticada, é apenas isso:
(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+" (slurp "http://www.stroustrup.com"))
Isso retorna a lista:
("http://www.morganstanley.com/" "http://www.cs.columbia.edu/" "http://www.cse.tamu.edu" ...)
Posso fazer algo semelhante no Emacs Lisp?
Talvez uma função como (re-seq regexp (buffer-string))
essa retorne '(firstmatch secondmatch thirdmatch ...)
?
M-x occur
isso que acontece, mas eu procuraria dentro por mais funções de baixo nível para fazer isso.occur
. Vou ter que olhar através de sua fonte.s.el
, mas talvez haja mais por aí. Aqui: github.com/magnars/s.el#s-match-strings-all-regex-string e quanto a isso?Respostas:
Aqui está como você pode fazer isso com base em strings, conforme solicitado.
fonte
(re-seq "^.*$" "")
. Regexp válido, sequência válida, mas nunca termina.Provavelmente vale a pena notar que invocar
occur
com o argumento universal faz com que ele preencha o*Occur*
buffer apenas com correspondências - sem nomes de arquivos, números de linhas ou informações de cabeçalho. Quando combinado com um grupo de captura, isso permite extrair qualquer padrão desejado.Por exemplo,
C-u M-x occur
seguido de\"\(.*\)\"
solicitará ao usuário qual grupo de captura coletar (padrão\1
) e, em seguida, colocará o conteúdo de cada sequência de caracteres citada no*Occur*
buffer.fonte
Eu tenho uma resposta do emacs lisp para essa pergunta postada: /codegolf//a/44319/18848
Usando a mesma estrutura (while (search) (print)), você pode modificá-lo em uma função para enviar correspondências em um buffer para uma lista e retorná-lo assim:
fonte
match-string
por,match-string-no-properties
para que o destaque da sintaxe não seja extraído. Você pode passar umregexp-group-index
para usar para poder escolher qual texto será armazenado. Além de reverter a ordem da pesquisa (a lista atual é a penúltima). Veja esta resposta que inclui uma versão modificada emacs.stackexchange.com/a/38752/2418Usar
s.el
isso teria sido mais curto, mas, infelizmente, gera muitas correspondências:Se estiver tudo bem (o regex para URLs não é perfeito de qualquer maneira), isso pode ser mais curto e, se não, acho que não poderia ser mais curto do que a resposta de Alan Shutko.
fonte
Deixe-me mencionar por que acho que isso não está implementado no núcleo. Simplesmente por razões de eficiência: não há necessidade de copiar, criar listas, distribuí-las e coletá-las no lixo. Em vez disso, armazene toda a cadeia como buffer e opere com limites de correspondência inteira. É assim que
occur
funciona, por exemplo: ele corresponde a uma sequência de cada vez e insere a correspondência*occur*
. Ele não corresponde a todas as seqüências de uma vez, insere-as na lista, faz um loop na lista para inserir*occur*
e coletar na lista e suas cadeias de lixo.Assim como você não escreveria
(do (def x 1) (def x (+ 2 x)))
no Clojure, por padrão, não deveria tentar fazer com que o Elisp se comportasse como uma linguagem funcional. Eu adoraria se fosse, mas temos que fazer o devido com o que temos no momento.fonte
Se me for permitido um plug-in, dê uma olhada na minha biblioteca "m-buffer".
Retorna uma lista de marcadores aos quais corresponde
foo
.fonte