我对重新发现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"}