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

あなたの問題は、エスケープに関する限り、ヒアドキュメントが二重引用符で囲まれた文字列のように振る舞うことです。つまり\"、ヒアドキュメントの a は"、文字列と同じようになります。観察:

>> 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!\""
}
于 2013-10-11T04:59:41.333 に答える