如何在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
相关产品推荐
相关产品推荐

