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

将YAML文件中的正则表达式与ruby中的哈希值进行比较,ruby,regex,yaml,Ruby,Regex,Yaml,因此,我试图编写一个匹配器来验证散列中的数据,从YAML文件中提取定义。现在有点混乱,但稍后会进行重构 我想验证一个值是否是散列中的数字。我能够解析输入文件和YAML文件 这是我的YAML :pmt_sum: - Type: NUMBER - Expected: !ruby/regexp '/\d*/' 下面是应该执行检查的代码,它是通过哈希头进行迭代的函数的一部分。\u def是一个哈希: header_def.each { |key, value| if parsed_hash

因此,我试图编写一个匹配器来验证散列中的数据,从YAML文件中提取定义。现在有点混乱,但稍后会进行重构

我想验证一个值是否是散列中的数字。我能够解析输入文件和YAML文件

这是我的YAML

:pmt_sum:
 - Type: NUMBER
 - Expected: !ruby/regexp '/\d*/'
下面是应该执行检查的代码,它是通过哈希头进行迭代的函数的一部分。\u 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
}
散列[0][key]将从输入文件中取出:pmt_sum键,如果它与YAML中的内容不匹配,则输出消息。这适用于我编写的任何硬代码,但是如果我尝试使用正则表达式,它会给出以下结果:

pmt_sum value does not match (?-mix:\d*), it returned 7
有没有人有从YAML文件将正则表达式传递到Ruby程序的技巧


Edit:ignore,我使用case语句来检查值[2][Expected]的类,并在它是Regexp时使用了.match。谢谢你的帮助

有几件事我会做得不同

YAML将生成一个单元素哈希数组,这是不正常的:

require 'yaml'

obj = YAML.load(<<EOT)
:pmt_sum:
 - Type: NUMBER
 - Expected: !ruby/regexp '/\d*/'
EOT

obj # => {:pmt_sum=>[{"Type"=>"NUMBER"}, {"Expected"=>/\d*/}]}
保存并运行将输出foo.yaml。查看该文件显示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”创建为:

---
: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*/


生成的YAML将根据所有语言的需要使用,您将拥有所需的功能。

我最后使用了一个case语句来检查所需的类是否为Regexp,并将其转储到变量中以确保可读性


无论如何谢谢你

不要试图在YAML文件中存储Ruby正则表达式,而是将其保存为字符串,然后在读取YAML后使用/{string}/或Regexp.newstring对其进行转换。这使得YAML在其他语言之间保持可移植性。没有header_def,很难判断问题出在哪里。请提供它的最低版本。
/#{ hash['Expected'] }/ # => /\d*/
Regexp.new(hash['Expected']) # => /\d*/