1

ファイルには明らかに複数行の正規表現が保存されてYAML::dump(b1)おり、問題なく保存されています。

質問、Syckが複数行の正規表現に問題があると思われる場合、どうすればロードバックできますか?

b2 = YAML::load(File.open("browserObj.yaml", 'r'))

Syck::TypeError: Invalid Regular expression: "/\\A\\s*\n        ([a-zA-Z][\\-+.a-zA-Z\\d]*):                           (?# 1: scheme)\n        (?:\n           ((?:[\\-_.!~*'()a-zA-Z\\d;?:@&=+$,]|%[a-fA-F\\d]{2})(?:[\\-_.!~*'()a-zA-Z\\d;\\/?:@&=+$,\\[\\]]|%[a-fA-F\\d]{2})*) \\                   (?# 2: opaque)\n        |\n           (?:(?:\n             \\/\\/(?:\n \\                (?:(?:((?:[\\-_.!~*'()a-zA-Z\\d;:&=+$,]|%[a-fA-F\\d]{2})*)@)? \\       (?# 3: userinfo)\n                   (?:((?:(?:[a-zA-Z0-9\\-.]|%\\h\\h)+|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}|\\[(?:(?:[a-fA-F\\d]{1,4}:)*(?:[a-fA-F\\d]{1,4}|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})|(?:(?:[a-fA-F\\d]{1,4}:)*[a-fA-F\\d]{1,4})?::(?:(?:[a-fA-F\\d]{1,4}:)*(?:[a-fA-F\\d]{1,4}|\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}))?)\\]))(?::(\\d*))?))? (?# 4: host, 5: port)\n               |\n                 ((?:[\\-_.!~*'()a-zA-Z\\d$,;:@&=+]|%[a-fA-F\\d]{2})+) \\                (?# 6: registry)\n               )\n             |\n             (?!\\/\\/)) \\                          (?# XXX: '\\/\\/' is the mark for hostport)\n \\            (\\/(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*(?:;(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*)*(?:\\/(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*(?:;(?:[\\-_.!~*'()a-zA-Z\\d:@&=+$,]|%[a-fA-F\\d]{2})*)*)*)? \\                   (?# 7: path)\n           )(?:\\?((?:[\\-_.!~*'()a-zA-Z\\d;\\/?:@&=+$,\\[\\]]|%[a-fA-F\\d]{2})*))? \\                (?# 8: query)\n        )\n        (?:\\#((?:[\\-_.!~*'()a-zA-Z\\d;\\/?:@&=+$,\\[\\]]|%[a-fA-F\\d]{2})*))? \\                 (?# 9: fragment)\n      \\s*\\z/x"
    from /usr/lib/ruby/1.9.1/syck/rubytypes.rb:284:in `yaml_new'
    from /usr/lib/ruby/1.9.1/syck.rb:135:in `transfer'
    from /usr/lib/ruby/1.9.1/syck.rb:135:in `node_import'
    from /usr/lib/ruby/1.9.1/syck.rb:135:in `load'
    from /usr/lib/ruby/1.9.1/syck.rb:135:in `load'
    from /usr/lib/ruby/1.9.1/syck.rb:146:in `block in load_file'
    from /usr/lib/ruby/1.9.1/syck.rb:145:in `open'
    from /usr/lib/ruby/1.9.1/syck.rb:145:in `load_file'
    from (irb):428
    from /usr/bin/irb:12:in `<main>'

rubytypes.rbへのパッチについての議論を見たことがありますが、それ以外は何もありません。

Psychに切り替えると、ワームの別の缶が開かれるので、切り替えたくありません。

YAML::ENGINE.yamler = "psych"

# attempt to load from file again
TypeError: can't convert Fixnum into String

どうしたの?希望はありますか?このエラーによって不透明になるまで、Syck、Psych、YAML解析の内部についての予備知識はありませんでした。

4

2 に答える 2

1

正規表現を文字列として保存できます。yamlファイルから読み戻すときは、文字列を正規表現に変換し直してください。Regexp.new myregexp_str-もちろん、これは単なる回避策です。

更新: または、本当に愚かなことをして、複数行の正規表現を処理するために精神にパッチを当てることができます。パッチを適用したメソッドは投稿するのに時間がかかるので、ここで入手してください。しかし、ここに実際にパッチが適用されたものの説明があります。

module Psych
  module Visitors
    class ToRuby < Psych::Visitors::Visitor
       # ...
      def deserialize
        # ... L75
        when "!ruby/regexp"
        o.value =~ /^\/(.*)\/([mixn]*)$/m # <- notice the added "m" for multiline mode
        # ...
      end
    end
  end
end

を使用してruby-1.9.3-p194

于 2012-11-29T13:13:09.663 に答える
0

周りに潜んでいるすべての人にとって、これは古いバグのように見えます。私はruby1.9.3を試してみましたが、次のようになりました。 [3] pry(main)> YAML.load(YAML.dump(/asd/m)) => /asd/m

于 2014-10-14T13:47:45.443 に答える