gpt4 book ai didi

ruby - 如何检查字符串是否是有效的 YAML?

转载 作者:数据小太阳 更新时间:2023-10-29 07:27:13 25 4
gpt4 key购买 nike

我想检查一个字符串是否是有效的 YAML。我想使用 gem 或库在我的 Ruby 代码中执行此操作。我只有这个 begin/rescue 子句,但它没有得到正确的拯救:

def valid_yaml_string?(config_text)
require 'open-uri'
file = open("https://github.com/TheNotary/the_notarys_linux_mint_postinstall_configuration")
hard_failing_bad_yaml = file.read
config_text = hard_failing_bad_yaml
begin
YAML.load config_text
return true
rescue
return false
end
end

不幸的是,我遇到了一个可怕的错误:

irb(main):089:0> valid_yaml_string?("b")
Psych::SyntaxError: (<unknown>): mapping values are not allowed in this context at line 6 column 19
from /home/kentos/.rvm/rubies/ruby-1.9.3-p374/lib/ruby/1.9.1/psych.rb:203:in `parse'
from /home/kentos/.rvm/rubies/ruby-1.9.3-p374/lib/ruby/1.9.1/psych.rb:203:in `parse_stream'
from /home/kentos/.rvm/rubies/ruby-1.9.3-p374/lib/ruby/1.9.1/psych.rb:151:in `parse'
from /home/kentos/.rvm/rubies/ruby-1.9.3-p374/lib/ruby/1.9.1/psych.rb:127:in `load'
from (irb):83:in `valid_yaml_string?'
from (irb):89
from /home/kentos/.rvm/rubies/ruby-1.9.3-p374/bin/irb:12:in `<main>'

最佳答案

使用代码的清理版本:

require 'yaml'
require 'open-uri'

URL = "https://github.com/TheNotary/the_notarys_linux_mint_postinstall_configuration"

def valid_yaml_string?(yaml)
!!YAML.load(yaml)
rescue Exception => e
STDERR.puts e.message
return false
end

puts valid_yaml_string?(open(URL).read)

我得到:

(<unknown>): mapping values are not allowed in this context at line 6 column 19
false

当我运行它时。

原因是,您从该 URL 获取的数据根本不是 YAML,而是 HTML:

open('https://github.com/TheNotary/the_notarys_linux_mint_postinstall_configuration').read[0, 100]
=> " \n\n\n<!DOCTYPE html>\n<html>\n <head prefix=\"og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# githubog:"

如果您只想要真/假响应,无论它是可解析的 YAML,请删除此行:

STDERR.puts e.message

不幸的是,超出此范围并确定字符串是否为 YAML 字符串变得更加困难。你可以做一些嗅探,寻找一些提示:

yaml[/^---/m]

将搜索 YAML“文档”标记,但 YAML 文件不必使用这些标记,它们也不必位于文件的开头。我们可以添加它来加强测试:

!!YAML.load(yaml) && !!yaml[/^---/m]

但是,即使这样也会留下一些漏洞,因此添加一个测试以查看解析器返回的内容可能会更有帮助。 YAML 可以返回 Fixnum、String、Array 或 Hash,但如果您已经知道会发生什么,则可以查看 YAML 想要返回的内容。例如:

YAML.load(({}).to_yaml).class
=> Hash
YAML.load(({}).to_yaml).instance_of?(Hash)
=> true

因此,您可以寻找哈希:

parsed_yaml = YAML.load(yaml)
!!yaml[/^---/m] && parsed_yaml.instance_of(Hash)

Hash 替换为您认为应该获得的任何类型。

可能有更好的方法来嗅出它,但这些是我首先要尝试的。

关于ruby - 如何检查字符串是否是有效的 YAML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16329059/

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