Auf der heutigen Code Golf Stack Exchange-Website habe ich diese Antwort in Clojure auf die Frage "Alle Links auf einer Webseite abrufen" gefunden.
(->> (slurp "http://www.stroustrup.com")
(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+"))
Ohne das schicke Makro ist es nur so:
(re-seq #"(?:http://)?www(?:[./#\+-]\w*)+" (slurp "http://www.stroustrup.com"))
Dies gibt die Liste zurück:
("http://www.morganstanley.com/" "http://www.cs.columbia.edu/" "http://www.cse.tamu.edu" ...)
Kann ich in Emacs Lisp etwas Ähnliches tun?
Vielleicht (re-seq regexp (buffer-string))
kehrt so eine Funktion zurück '(firstmatch secondmatch thirdmatch ...)
?
elisp
regular-expressions
Kindermädchen
quelle
quelle
M-x occur
tut, aber ich würde nach tieferen Funktionen suchen, um das zu tun.occur
. Ich muss die Quelle durchsehen.s.el
, aber vielleicht gibt es da draußen noch mehr. Hier: github.com/magnars/s.el#s-match-strings-all-regex-string Wie wäre es damit?Antworten:
Hier ist, wie Sie es basierend auf Zeichenfolgen tun können, wie angefordert.
quelle
(re-seq "^.*$" "")
. Gültiger regulärer Ausdruck, gültige Zeichenfolge, wird jedoch nie beendet.Es ist wahrscheinlich erwähnenswert, dass das Aufrufen
occur
mit dem universellen Argument dazu führt, dass der*Occur*
Puffer nur mit Übereinstimmungen gefüllt wird - keine Dateinamen, Zeilennummern oder Header-Informationen. In Kombination mit einer Erfassungsgruppe kann so das gewünschte Muster extrahiert werden.Wenn Sie z. B.
C-u M-x occur
gefolgt von\"\(.*\)\"
eingeben, wird der Benutzer aufgefordert, welche Erfassungsgruppe erfasst werden soll (Standardeinstellung\1
), und der Inhalt jeder in Anführungszeichen gesetzten Zeichenfolge wird in den*Occur*
Puffer eingefügt.quelle
Ich habe eine Emacs-Lisp-Antwort auf diese Frage: /codegolf//a/44319/18848
Mit derselben Struktur (while (search) (print)) können Sie sie in eine Funktion umwandeln, um Übereinstimmungen in einem Puffer in eine Liste zu verschieben und wie folgt zurückzugeben:
quelle
match-string
mit ,match-string-no-properties
so dass die Syntax Highlight nicht extrahiert wird. Möglicherweise möchten Sie ein übergebenregexp-group-index
, damit Sie auswählen können, welcher Text gespeichert wird. Ebenso wie das Umkehren der Suchreihenfolge (die aktuelle Liste ist von Anfang bis Ende). Diese Antwort enthält eine geänderte Version. Emacs.stackexchange.com/a/38752/2418Mit
s.el
diesem habe schon kürzer, aber leider gibt es zu viele Übereinstimmungen:Wenn dies in Ordnung ist (der reguläre Ausdruck für URLs ist sowieso nicht perfekt), könnte dies einfach kürzer sein, und wenn nicht, dann könnte ich es nicht kürzer machen als Alan Shutkos Antwort.
quelle
Lassen Sie mich nur erwähnen, warum ich denke, dass dies nicht im Kern implementiert ist. Einfach aus Effizienzgründen: Es ist nicht erforderlich, Listen zu kopieren, zu erstellen, weiterzugeben und durch Müll zu sammeln. Speichern Sie stattdessen die gesamte Zeichenfolge als Puffer und arbeiten Sie mit ganzzahligen Übereinstimmungsgrenzen. So
occur
funktioniert es zum Beispiel: Es stimmt mit jeweils einer Zeichenfolge überein und fügt die Übereinstimmung ein*occur*
. Es werden nicht alle Zeichenfolgen gleichzeitig abgeglichen, sie werden in die Liste aufgenommen, die einzufügende Liste wird durchlaufen,*occur*
und die Liste und ihre Zeichenfolgen werden vom Müll gesammelt.Genau wie Sie nicht
(do (def x 1) (def x (+ 2 x)))
in Clojure schreiben würden , sollten Sie standardmäßig nicht versuchen, Elisp wie eine funktionale Sprache zu verhalten. Ich würde es lieben, wenn es so wäre, aber wir müssen uns an dem ausrichten, was wir im Moment haben.quelle
Wenn mir ein Plug erlaubt ist, schau in meine "m-buffer" Bibliothek.
Gibt eine Liste von Markern zurück, zu denen eine Übereinstimmung besteht
foo
.quelle