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

