在常见的lisp中提取正则表达式匹配

时间:2014-06-23 03:34:07

标签: common-lisp sbcl cl-ppcre

我必须在这里遗漏一些非常基本的东西。

我需要从常见的lisp中的匹配中提取捕获组。 当我在解释器中进行评估时(sbcl实现):

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

我明白了:

"sample1.png"
#("1")

但如果我将该表达式绑定到一个值,请说

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

数字的值变为"sample1.png"。如何获得打印的"1"

1 个答案:

答案 0 :(得分:4)

您的问题

您正在寻找

(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