为什么 re-find 返回一个包含两个元素的向量?

why is re-find returning a vector with two elements?

这样使用re-find时:

(re-find #"(\d{3})" "abc1245")

我得到:

["124" "124"]

当我期望只有一个值时。怎么回事?

这是因为括号创建了一个正则表达式 "group"。参见

举个例子。区别如下:

(re-find #"(\d{3})"  "abc1245")     => ["124" "124"]   ; #1
(re-find  #"\d{3}"   "abc1245")     =>  "124"          ; #2
(re-seq   #"\d{3}"   "abc1245")     => ("124")         ; #3
(re-seq   #"\d{3}"   "abc12345678") => ("123" "456")   ; #4

所以,#1 给了你结果和 "group result"。 #2 只为您提供匹配的子字符串。

#3 给出了所有匹配项的顺序。由于只有 4 位数字,剩余的“5”不足以匹配 3 位数字。

#4 总共给出 8 个数字,所以我们得到 "123""456" 作为匹配项,剩下 7 和 8,因为我们只需要三位数。

正则表达式中的圆括号 (\d{3}) 定义一个捕获组,因此 re-find returns 整个匹配和所有匹配组。 根据 re-find doc:

Returns the next regex match, if any, of string to pattern, using java.util.regex.Matcher.find(). Uses re-groups to return the groups.

如果您删除括号 - 您将只得到一个符合您预期的匹配项:

=> (re-find #"\d{3}" "abc1245")
=> "124"
=> (re-find #"(\d{3})" "abc1245")
=> ["124" "124"]

你可以在这个online repl.

中自行查看