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

Ruby如何将指定格式字符串分割转换为目标Hash结构?

如何将指定字符串转换为目标Hash结构?

以下是几种简洁的Ruby实现方式,帮你把输入字符串转换成目标Hash:

方法一:逐行处理并构建Hash

利用each_line遍历字符串的每一行,结合正则匹配提取键和数值,最后组装成Hash:

str = "race_1: 650m, 215m, 265m, 315m\r\nrace_2: 165m, 215m, 265m, 315m."

result = str.each_line.with_object({}) do |line, hash|
  # 匹配键名和数值段,忽略末尾的标点
  match_data = line.match(/(\w+):\s*([\d,m\s]+)/)
  next unless match_data

  # 提取键并转为Symbol(若需字符串键,直接用 match_data[1] 即可)
  key = match_data[1].to_sym
  # 拆分数值字符串,去掉m和可能的点号,转成整数数组
  values = match_data[2].split(/,\s*/).map { |val| val.gsub(/[m.]/, '').to_i }
  
  hash[key] = values
end

# 输出结果
p result
# => {:race_1=>[650, 215, 265, 315], :race_2=>[165, 215, 265, 315]}

方法二:用全局匹配直接生成Hash

通过scan一次性匹配所有race条目,再用to_h直接转换为Hash:

str = "race_1: 650m, 215m, 265m, 315m\r\nrace_2: 165m, 215m, 265m, 315m."

result = str.scan(/(\w+):\s*([\d,m\s]+)/).to_h do |key, values_str|
  [
    key.to_sym, # 转为Symbol,按需改为key保留字符串
    values_str.split(/,\s*/).map { |val| val.gsub(/m|\./, '').to_i }
  ]
end

p result
# => {:race_1=>[650, 215, 265, 315], :race_2=>[165, 215, 265, 315]}

关键步骤说明:

  • 正则匹配:(\w+):\s*([\d,m\s]+) 捕获两部分内容:第一组是race的键名(如race_1),第二组是所有带m的数值字符串。
  • 数值处理:用split(/,\s*/)拆分数值列表,再通过gsub去掉每个数值后的m和可能的末尾点号,最后转成整数。
  • 键的类型:示例中把键转为Symbol,若需要字符串类型的键,直接使用match_data[1]或key即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:20:17