解析表示整数列表和整数范围的字符串

Parsing strings representing lists of integers and integer spans

我正在寻找一个在 Emacs Lisp 中解析整数列表的函数,与 Perl 的 Set::IntSpan 一致。也就是说,我希望能够做这样的事情:

(parse-integer-list "1-3, 4, 8, 18-21")
⇒ (1 2 3 4 8 18 19 20 21)

有没有专门的 elisp 库?

以下是你想要的:

(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))))

代码遍历传入的字符串,搜索纯数字或数字范围。在每次匹配时,它会调用 number-sequence,或者只为普通匹配调用一个数字,或者为范围匹配调用两个数字,并将每个结果数字序列推入列表。为了解释 push 向后构建结果,最后它反转列表中的所有范围,连接它们,然后反转结果和 returns 它。

使用您的示例输入调用 parse-integer-list

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

产生:

(1 2 3 4 8 18 19 20 21)