gpt4 book ai didi

ruby - 创建正则表达式以匹配 Ruby 中的 YAML 键

转载 作者:太空宇宙 更新时间:2023-11-03 18:23:07 24 4
gpt4 key购买 nike

根据 YAML 文件中的以下数据,是否可以在 Ruby 中创建一个正则表达式来匹配列表中相应的组和项目键

源数据

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”。然而,组名和项目名不一定是单个单词,每个组不必包含所有项目。例如

"Group A Item 1"
"c item 1"
"GroupA 1"

因此,我们需要一种方法来解析输入字符串以获取相应的组和项目,以便将正确的值传递给进一步向下的方法。鉴于该类中的其他类似方法使用正则表达式,并且有一个 YAML 文件包含组项对的最终列表,正则表达式是我的第一个想法。

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

非常感谢

伊恩

最佳答案

为什么要匹配 YAML 文件中的任何内容?使用 YAML 将其加载到 Ruby 中解析器,并搜索它,或者在内存中修改。

如果您想保存修改后的文件,YAML 解析器可以发出一个 Ruby 对象作为 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"]}

一旦你有了你想要的,你可以很容易地修改它们的内容,将它们替换回内存中的哈希,然后写出来。

关于ruby - 创建正则表达式以匹配 Ruby 中的 YAML 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14814214/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com