Sur le site de Code Golf Stack Exchange aujourd'hui, j'ai trouvé cette réponse dans Clojure à la question "Obtenez tous les liens sur une page Web".
(->> (slurp "http://www.stroustrup.com")
(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+"))
Sans la macro fantaisie, c'est juste ceci:
(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+" (slurp "http://www.stroustrup.com"))
Cela renvoie la liste:
("http://www.morganstanley.com/" "http://www.cs.columbia.edu/" "http://www.cse.tamu.edu" ...)
Puis-je faire quelque chose de similaire dans Emacs Lisp?
Peut-être qu'une fonction comme (re-seq regexp (buffer-string))
celle-là revient '(firstmatch secondmatch thirdmatch ...)
?
elisp
regular-expressions
nounou
la source
la source
M-x occur
fait, mais je regarderais à l'intérieur pour plus de fonctions de bas niveau pour le faire.occur
. Je vais devoir regarder à travers sa source.s.el
, mais peut-être y a-t-il plus. Ici: github.com/magnars/s.el#s-match-strings-all-regex-string que diriez-vous?Réponses:
Voici comment vous pouvez le faire en fonction des chaînes, comme demandé.
la source
(re-seq "^.*$" "")
. Expression valide, chaîne valide, mais elle ne se termine jamais.Il est probablement intéressant de noter que l'invocation
occur
avec l'argument universel entraîne le remplissage du*Occur*
tampon avec uniquement des correspondances - aucun nom de fichier, numéro de ligne ou information d'en-tête. Lorsqu'il est combiné avec un groupe de capture, cela permet d'extraire le motif souhaité.Par exemple,
C-u M-x occur
suivi de\"\(.*\)\"
invite l'utilisateur à sélectionner le groupe de capture à collecter (par défaut\1
), puis place le contenu de chaque chaîne entre guillemets dans le*Occur*
tampon.la source
J'ai une réponse lisp emacs à cette question publiée: /codegolf//a/44319/18848
En utilisant la même structure (while (search) (print)), vous pouvez la modifier en fonction pour pousser les correspondances dans un tampon vers une liste et la retourner comme ceci:
la source
match-string
parmatch-string-no-properties
pour que la coloration syntaxique ne soit pas extraite. Vous voudrez peut-être passer unregexp-group-index
à utiliser pour pouvoir choisir le texte à stocker. En plus d'inverser l'ordre de recherche (la liste actuelle est la dernière à la première). Voir cette réponse qui inclut une version modifiée emacs.stackexchange.com/a/38752/2418Son utilisation
s.el
aurait été plus courte, mais malheureusement, cela donne trop de correspondances:Si cela est correct (l'expression rationnelle des URL n'est pas parfaite de toute façon), cela pourrait être plus court, sinon, je ne pense pas que je pourrais le rendre plus court que la réponse d'Alan Shutko.
la source
Permettez-moi de mentionner pourquoi je pense que cela n'est pas implémenté dans le noyau. Tout simplement pour des raisons d'efficacité: il n'est pas nécessaire de copier, créer des listes, les transmettre et les récupérer. Au lieu de cela, stockez la chaîne entière comme tampon et opérez avec des limites de correspondance entières. C'est ainsi que cela
occur
fonctionne, par exemple: il correspond à une chaîne à la fois et insère la correspondance dans*occur*
. Il ne correspond pas à toutes les chaînes à la fois, les place dans la liste, fait une boucle dans la liste pour l'insérer*occur*
et récupérer la liste et ses chaînes.Tout comme vous n'écririez pas
(do (def x 1) (def x (+ 2 x)))
dans Clojure, vous ne devriez pas essayer par défaut de faire en sorte qu'Elisp se comporte comme un langage fonctionnel. J'adorerais que ce soit le cas, mais nous devons nous en tenir à ce que nous avons en ce moment.la source
Si je peux me permettre un plug, jetez un oeil à ma bibliothèque "m-buffer".
Renvoie une liste de marqueurs auxquels correspond
foo
.la source