将YAML文件中的正则表达式与ruby中的哈希值进行比较

时间:2014-11-13 20:00:24

标签: ruby regex yaml

所以我试图编写一个匹配器来验证哈希中的数据,从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。谢谢你的帮助!

2 个答案:

答案 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,您将拥有所需的功能。