所以我试图编写一个匹配器来验证哈希中的数据,从YAML文件中提取定义。它现在有点乱,但它会在以后被重构。
我想验证值是散列中的数字。我能够解析输入文件和YAML文件。
这是我的YAML
:pmt_sum:
- Type: NUMBER
- Expected: !ruby/regexp '/\d*/'
这里是应该进行检查的代码,它是遍历散列的函数的一部分(header_def
是散列):
header_def.each { |key, value|
if parsed_hash[0][key] != value[2]["Expected"]
puts "#{key} value does not match #{value[1]["Expected"]}, it returned #{parsed_hash[0][key]"
else
puts "working as intended"
end
}
hash[0][key]
会从输入文件中提取:pmt_sum
密钥,如果它与YAML中的内容不匹配,则输出该消息。这适用于我硬编码的任何东西,但是如果我尝试使用正则表达式,它会吐出这个:
pmt_sum value does not match (?-mix:\d*), it returned 7
有没有人有关于将正则表达式从YAML文件传递给Ruby程序的提示?
编辑:忽略,我使用case语句修复它以检查值类[2] ["预期"],并在它是正则表达式时使用.match。谢谢你的帮助!
答案 0 :(得分:0)
我最后使用case语句来检查期望的类是否是Regexp(为了便于阅读,将事物转储到变量中。)
非常感谢!
答案 1 :(得分:-1)
我做了几件不同的事情。
YAML将生成一个单元素哈希数组,这是不正常的:
require 'yaml'
obj = YAML.load(<<EOT)
:pmt_sum:
- Type: NUMBER
- Expected: !ruby/regexp '/\d*/'
EOT
obj # => {:pmt_sum=>[{"Type"=>"NUMBER"}, {"Expected"=>/\d*/}]}
相反,你可能真的想要一个哈希,因为它也可以工作。这是构建一个的快速方法:
require 'yaml'
hash = {
"Type" => "NUMBER",
"Expected" => /\d*/
}
File.write('foo.yaml', hash.to_yaml)
保存并运行将输出&#34; foo.yaml&#34;。查看该文件显示YAML为:
---
Type: NUMBER
Expected: !ruby/regexp /\d*/
使用以下方式重新加载:
require 'yaml'
hash = YAML.load_file('foo.yaml')
hash # => {"Type"=>"NUMBER", "Expected"=>/\d*/}
此时,YAML正常往返。如果真的想要你的结构,首先用Ruby构建,然后将其发送到磁盘,然后处理:
require 'yaml'
hash = {:pmt_sum=>[{"Type"=>"NUMBER"}, {"Expected"=>/\d*/}]}
File.write('foo.yaml', hash.to_yaml)
在运行时,会创建&foo.yaml&#39;为:
---
:pmt_sum:
- Type: NUMBER
- Expected: !ruby/regexp /\d*/
但是,回到为什么它更好地简化数据。使用简单的哈希访问条目更容易:
hash = {
:pmt_sum => [
{"Type" => "NUMBER"},
{"Expected" => /\d*/}
]
}
hash[:pmt_sum][1]['Expected'] # => /\d*/
与
hash = {
"Type" => "NUMBER",
"Expected" => /\d*/
}
hash['Expected'] # => /\d*/
关于将正则表达式保存到YAML中:YAML应该可以在语言之间移植,因此您可以将其锁定到Ruby中,而不会获得任何真正的主要优势。而不是像以下那样定义模式:
Expected: !ruby/regexp '/\d*/'
使用类似的东西:
Expected: '\d*'
将产生一个字符串:
Expected: "\\d*"
在YAML文件中。
使用YAML解析它会将其返回到一个字符串,因此在使用它之前将其转换为正则表达式,然后使用其中一个:
/#{ hash['Expected'] }/ # => /\d*/
或
Regexp.new(hash['Expected']) # => /\d*/
所有语言都会根据需要使用生成的YAML,您将拥有所需的功能。