2017-07-03 3 views

Antwort

1

Die folgende tut, was Sie wollen:

(defun parse-integer-list (str) 
    "Parse string representing a range of integers into a list of integers." 
    (let (start ranges) 
    (while (string-match "\\([0-9]+\\)\\(?:-\\([0-9]+\\)\\)?" str start) 
     (push 
     (apply 'number-sequence 
       (seq-map 'string-to-int 
         (seq-filter 
         'identity 
         (list (match-string 1 str) (match-string 2 str))))) 
      ranges) 
     (setq start (match-end 0))) 
    (nreverse (seq-mapcat 'nreverse ranges)))) 

Der Code Schleifen über den eingehenden Zeichenfolge für ganze Zahlen oder Zahlenbereiche zu suchen. Bei jedem Spiel ruft es number-sequence entweder mit einer Nummer für eine einfache Übereinstimmung oder mit zwei Zahlen für eine Bereichsübereinstimmung auf und schiebt jede resultierende Zahlensequenz in eine Liste. Um das Ergebnis push zu berücksichtigen, kehrt es am Ende alle Bereiche in der Liste um, verkettet sie, kehrt dann das Ergebnis um und gibt es zurück.

Aufruf parse-integer-list mit Ihrem Beispiel Eingabe:

(parse-integer-list "1-3, 4, 8, 18-21") 

produziert:

(1 2 3 4 8 18 19 20 21) 
Verwandte Themen