创建一个正则表达式以匹配Ruby中的YAML键

时间:2013-02-11 14:34:43

标签: ruby regex yaml

根据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文件包含组 - 项对的确定列表,正则表达式是我的第一个思路。

但是,我愿意接受更好的方法

非常感谢

伊恩

1 个答案:

答案 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"]}

获得所需的内容后,您可以轻松修改其内容,将其替换回内存中的哈希值,并将其写出来。