根据YAML文件中的以下数据,是否可以在Ruby中创建一个与列表中相应的Group和Item键匹配的正则表达式
来源数据
Groups:
GroupA:
- item 1
- item 3
Group B:
- itemA
- item 3
C:
- 1
- item 3
测试字符串:
GroupA item 1
Group B itemA
c item 1
C 1
GroupA 1
预期比赛组
Match 1:
1. GroupA
2. item 1
Match 2:
1. Group B
2. itemA
Match 3:
1. C
2. 1
感谢您的帮助!
伊恩
================================== 更新:继Tin Mans评论之后 -
这里有一些进一步的背景......
插件中存在一个包含许多方法的类。每个方法都接收一个字符串,该字符串被解析以确定执行的操作。在某些方法中,字符串的内容用于后续操作 - 当需要时,使用正则表达式来提取(或匹配)字符串的相关部分。遗憾的是,无法控制上游代码来改变这一过程。
在这种情况下,字符串采用" Group Item Status"的形式。但是,组和项目名称不一定是单个单词,每个组不必包含所有项目。 e.g。
"Group A Item 1"
"c item 1"
"GroupA 1"
因此,需要的是一种解析输入字符串以获取相应的Group和Item的方法,以便将正确的值传递给下一行的方法。鉴于该类中的其他类似方法使用正则表达式,并且有一个YAML文件包含组 - 项对的确定列表,正则表达式是我的第一个思路。
但是,我愿意接受更好的方法
非常感谢
伊恩
答案 0 :(得分:3)
为什么要匹配YAML文件中的任何内容?使用YAML解析器将其加载到Ruby中,然后搜索它,或在内存中修改。
如果要保存修改后的文件,YAML解析器可以将YAML作为YAML发出,然后保存。
require 'yaml'
yaml = '
---
Groups:
GroupA:
- item 1
- item 3
Group B:
- itemA
- item 3
C:
- 1
- item 3
'
yaml = YAML.load(yaml)
# => {"Groups"=>{"GroupA"=>["item 1", "item 3"], "Group B"=>["itemA", "item 3"], "C"=>[1, "item 3"]}}
yaml['Groups']['GroupA'].first
# => "item 1"
yaml['Groups']['Group B'][1]
# => "item 3"
yaml['Groups']['C'].last
# => "item 3"
基于以上定义,可以像这样操作数据:
yaml = YAML.load(yaml)
groups = yaml['Groups']
new_group = {
'groupa_first' => groups['GroupA'].first,
'groupb_second' => groups['Group B'][1],
'groupc_last' => groups['C'].last
}
yaml['New Group'] = new_group
puts yaml.to_yaml
哪个输出:
---
Groups:
GroupA:
- item 1
- item 3
Group B:
- itemA
- item 3
C:
- 1
- item 3
New Group:
groupa_first: item 1
groupb_second: item 3
groupc_last: item 3
我们为所有不同的语言提供YAML解析器的原因;它们使加载和使用数据变得容易。利用该工具,使用Ruby修改数据,如果需要,再次将其写出来。这是一个巨大的YAML文件,我甚至想到尝试在磁盘上修改它,因为它在内存中很容易做到。
现在,问题是,如何使用正则表达式搜索哈希的键?
yaml['Groups'].select{ |k,v| k[/^Group/] }
# => {"GroupA"=>["item 1", "item 3"], "Group B"=>["itemA", "item 3"]}
获得所需的内容后,您可以轻松修改其内容,将其替换回内存中的哈希值,并将其写出来。