5

Ruby 2.0,使用 Psych 的 Yaml 似乎无法转义双引号。有人有解决这个问题的想法吗?

data_ =<<END_
description: "Acme acquires ILM: Lucas says \"Inevitable!\""
END_

ap YAML.load(data_)

生产

    /Users/x/.rvm/rubies/ruby-2.0.0-p247/lib/ruby/2.0.0/psych.rb:205:in `parse': (<unknown>): did not find expected key while parsing a block mapping at line 1 column 1 (Psych::SyntaxError)    

用单引号转义条目是可行的,但如果它包含单引号,转义它们也会导致错误。

description: 'Acme acquires ILM: Lucas says "It\'s Inevitable!"'

在理想的世界中,条目将包含正确的 unicode 印刷引号,但我无法控制这些(尽管我可以在使用 YAML 处理之前替换它们)......

关于让 YAML 正确解析这个的任何想法?

更新:回答我的问题。发现可以通过复制来转义单引号,所以这行得通:

description: 'Acme acquires ILM: Lucas says "It''s Inevitable!"'

我通过使用 YAML.dump(the-desired-string) 发现了这一点

4

1 回答 1

7

您的问题是,就转义而言,heredoc 的行为就像双引号字符串。这意味着\"您的heredoc 中的 a 最终会出现"在您的字符串中。观察:

>> data_ =<<END_
description: "Acme acquires ILM: Lucas says \"Inevitable!\""
END_
>> puts data_
description: "Acme acquires ILM: Lucas says "Inevitable!""

您想将 a\放入 YAML 字符串中,因此您必须对其进行转义:

data_ =<<END_
description: "Acme acquires ILM: Lucas says \\"Inevitable!\\""
END_

或者,使用%q{...}引用您的字符串,使其表现得更像单引号字符串:

data_ = %q{
description: "Acme acquires ILM: Lucas says \"Inevitable!\""
}
于 2013-10-11T04:59:41.333 回答