解析表示整数列表和整数范围的字符串
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)
我正在寻找一个在 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)