为什么重新找到返回带有两个元素的向量?

时间:2018-02-06 20:16:09

标签: clojure clojurescript

以这种方式使用重新查找时:

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

我明白了:

["124" "124"]

当我期待一个值时。发生了什么事?

2 个答案:

答案 0 :(得分:3)

这是因为括号创建了一个正则表达式" 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为您提供了结果和"组结果"。 #2为您提供匹配的子字符串。

#3为您提供所有比赛的序列。因为只有4位数字,所以剩下的#3; 5"不足以匹配3位数。

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

答案 1 :(得分:2)

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

  

使用返回下一个正则表达式匹配的正则表达式匹配(如果有)   java.util.regex.Matcher.find()。使用重组返回组。

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

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

您可以在re-find doc

中自行查看