You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Clojure中将字符串按数字拆分并转换为Map

问题原因

  • 原有正则末尾强制匹配_,字符串最后一组键值对后没有下划线,会被直接漏掉
  • 正则内的\w+是贪婪匹配,会错误吞掉键名里的下划线,导致拆分出的键不符合预期

修正方案

方案1:修正正则表达式

调整为惰性匹配+兼容末尾无下划线的规则即可:

(def s "school_name_1_class_2_city_name_3")
(->> s
     (re-seq #"([a-zA-Z_]+?)_(\d+)(?:_|$)")
     (map (fn [[_ k v]] [(keyword k) (Integer/parseInt v)]))
     (into {}))
;; 运行结果:{:school_name 1, :class 2, :city_name 3}

方案2:按分割符拆分后分组(无正则边界问题,更稳妥)

先按下划线拆分字符串,再遍历分组组装键值对:

(def s "school_name_1_class_2_city_name_3")
(loop [parts (clojure.string/split s #"_")
       key-parts []
       res {}]
  (if (empty? parts)
    res
    (let [part (first parts)]
      (if (re-matches #"\d+" part)
        (recur (rest parts) [] (assoc res (keyword (clojure.string/join "_" key-parts)) (Integer/parseInt part)))
        (recur (rest parts) (conj key-parts part) res)))))
;; 运行结果:{:school_name 1, :class 2, :city_name 3}

内容的提问来源于stack exchange,提问作者arjunsv3691

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 10:24:01