如何将YAML文件解析为纯key=value字符串?附Ruby初始实现
Hey there! 你的初步逐行处理思路虽然直接,但YAML的语法其实比看起来复杂——比如嵌套结构、不同的字符串引号格式、甚至多行内容,手动正则很容易出问题。不如试试用Ruby自带的Psych库(封装在yaml标准库中)来解析YAML,它能正确处理所有YAML语法,然后我们再把解析后的哈希转换成你要的key=value格式,还能轻松实现提取指定键的需求。
完善后的Ruby实现代码
require 'yaml' # 加载并解析YAML文件 yaml_data = YAML.load_file('test.yml') # 递归遍历哈希,将嵌套键转换为点分隔格式,生成key=value对 def flatten_yaml(data, parent_key = '') result = [] data.each do |key, value| # 拼接当前层级的键(嵌套键用点分隔,比如test.line1) current_key = parent_key.empty? ? key.to_s : "#{parent_key}.#{key}" if value.is_a?(Hash) # 如果值还是哈希,继续递归遍历 result += flatten_yaml(value, current_key) else # 清理值的前后引号和多余空格,确保输出纯文本 cleaned_value = value.to_s.gsub(/\A"|"\Z/, '').strip result << "#{current_key}=#{cleaned_value}" end end result end # 生成所有key=value对 all_key_values = flatten_yaml(yaml_data) # (可选)提取指定键:比如只保留test下的所有键和options.item1 target_keys = ['test.line1', 'test.line2', 'test.line3', 'options.item1'] filtered_key_values = all_key_values.select do |line| key = line.split('=').first target_keys.include?(key) end # 输出结果(可选择输出全部或过滤后的内容) puts "=== 全部key=value结果 ===" puts all_key_values.join("\n") puts "\n=== 过滤后的key=value结果 ===" puts filtered_key_values.join("\n")
代码说明
- 依赖标准库:使用Ruby内置的
yaml库,无需额外安装gem,能正确解析YAML的嵌套结构、转义字符、多行字符串等复杂语法,避免手动逐行正则的漏洞。 - 递归处理嵌套:
flatten_yaml方法会递归遍历所有层级的哈希,将嵌套键转换为父键.子键的格式(比如test.line1),符合常规的扁平化键值对需求。 - 灵活过滤:通过定义
target_keys数组,可以轻松提取你需要的特定键,无需修改核心解析逻辑。 - 值清理:自动去除字符串前后的引号和多余空格,确保输出的是纯
key=纯文本值格式。
测试输出(对应你的YAML示例)
运行代码后,会得到以下结果:
=== 全部key=value结果 === test.line1=line 1 text test.line2=line 2 text test.line3=line 3 text options.item1=item 1 text options.item2=item 2 text options.item3=item 3 text === 过滤后的key=value结果 === test.line1=line 1 text test.line2=line 2 text test.line3=line 3 text options.item1=item 1 text
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

