我对重新发现Clojure有问题。其实我在做

(re-find #"-(?<foo>\d+)-(?<bar>\d+)-(?<toto>\d+)-\w{1,4}$"
"http://www.bar.com/f-a-c-a-a3-spok-ser-2-phse-2-1-6-ti-105-cv-9-31289-824-gu" )

我的结果很好:
["-9-31289-824-gt" "9" "31289" "824"]

但我更希望散列看起来像:
{:foo "9" :bar "31289" :toto "824"}

我了解到java.util.regex.Matcher/group正在执行类似的操作,但是我无法正确使用它。
谢谢你的帮助

最佳答案

直到JDK 7,JDK才支持命名捕获组。

Here's announcement on oracle blog

引用:



因为clojure支持JDK> = 6,所以如果您正在寻找 native 的东西,那么您就不走运了(clojure在后台使用了Java regex模式和Matchers)。

您始终可以使用外部库,例如named-re。那将给您确切您需要的。

呼唤

(require 'named-re.core)
(re-find #"-(?<foo>\d+)-(?<bar>\d+)-(?<toto>\d+)-\w{1,4}$"
     "http://www.bar.com/f-a-c-a-a3-spok-ser-2-phse-2-1-6-ti-105-cv-9-31289-824-gu" )

将返回
{:toto "824", :bar "31289", :foo "9", :0 "-9-31289-824-gu"}

10-06 07:22