common-lisp - 在 Common Lisp 中提取正则表达式匹配

标签 common-lisp sbcl cl-ppcre

我一定错过了一些非常基本的东西。

我需要从 Common Lisp 中的匹配中提取捕获组。 当我在解释器中 eval 时(sbcl 实现):

`(cl-ppcre::scan-to-strings ".*?(\\d).png" "sample1.png")`

我得到:

"sample1.png"
#("1")

但是如果我将该表达式绑定(bind)到一个值,比如说

`(setq number (cl-ppcre::scan-to-strings ".*(\\d).png" "sample1.png"))`

数字的值变为“sample1.png”。如何获取打印的“1”

最佳答案

你的问题

您正在寻找

(setf (values match position) 
      (cl-ppcre::scan-to-strings ".*(\\d).png" "sample1.png"))

另请参阅multiple-value-bind等人。

底层

常见的 lisp 函数可以返回 multiple values 。 这对应于其他语言(例如Python)中的“元组”返回值。 所以,当一个lisp函数,如floor ,返回多个值,Python 用户会写类似

(f,r) = floor(10,3)

floor(通常)会分配一个元组,当您编写fr = Floor(10,3)时会捕获该元组。

CL 多个值不会分配额外的存储空间,但除非您特别要求,否则额外的值将被丢弃:

(setf (values f r) (floor 10 3))

将捕获这两个值,但(setf f (floor 10 3))将丢弃r

关于common-lisp - 在 Common Lisp 中提取正则表达式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24358075/

相关文章:

package - 在 Common Lisp 中使用 iterate 包的正确方法

lisp - delete-if 中谓词的多个参数

emacs - 调试 Lisp & SLIME,错误 "Cannot find source location"

regex - 使用 cl-ppcre 的正则表达式匹配错误?

regex - 用 CL-PPCRE 匹配行尾

macros - 为什么 SBCL eval 函数会丢失它运行的 macrolet?

common-lisp - defpackage 和 in-package 调用的变化

common-lisp - 通用 Lisp 编程关键字

package - LISP cond 应答无包