YAML:使用转义双引号解析字符串时出错

时间:2013-10-11 04:20:04

标签: ruby string parsing escaping yaml

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(--desired-string)

发现了这一点

1 个答案:

答案 0 :(得分:7)

你的问题是,就逃逸而言,heredocs就像双引号字符串一样。这意味着你的heredoc中的\"最终只会在你的字符串中"。观察:

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

您希望在YAML字符串中获得\,这样您就必须逃避它:

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

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

data_ = %q{
description: "Acme acquires ILM: Lucas says \"Inevitable!\""
}