【问题标题】:TypeError reading in multiline regex多行正则表达式中的 TypeError 读取
【发布时间】:2012-11-17 13:01:13
【问题描述】:

在一个文件中显然存储了一个多行正则表达式,由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>'

我已经看到 discussion 关于 ruby​​types.rb 的补丁,但除此之外什么都没有。

我宁愿不切换到 Psych,因为这会打开另一罐蠕虫:

YAML::ENGINE.yamler = "psych"

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

发生了什么事?有希望吗?在此错误使其不透明之前,我对 Syck 和 Psych 以及 YAML 解析的内部都一无所知。

【问题讨论】:

    标签: ruby regex yaml psych syck


    【解决方案1】:

    您可以将正则表达式存储为字符串。当您从 yaml 文件中读取它时,只需将字符串转换回正则表达式。 Regexp.new myregexp_str - 这当然只是一种解决方法。

    更新: 或者你可以做一些非常愚蠢的事情并修补心理来处理多行正则表达式。 由于修补的方法很长,所以要抓住它here。 但这里是真正修补的解释。

    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

    【讨论】:

    • 是的,但是对于任何对我来说晦涩难懂的随机对象,我该怎么做呢?在这种情况下,b1 是一个 webdriver Watir::Browser 类型对象
    • 我想我对 Ruby 了解的不够多,无法使它变得透明。 IE。如何编写有效的替代保存和加载(序列化和反序列化)例程,尽可能接近原始对象类型和内容。
    • 您是否尝试过使用Marshal.dumpMarshal.load 似乎Marshal 可以处理多行正则表达式?
    • 我有,但是由于其他原因,Marshal 甚至不会保存这个对象:TypeError: can't dump TCPServer 所以 Yaml 对我来说效果更好。不过建议很好。
    • 谢谢; Psych 对我来说有一个不同的(更致命的)问题,所以我想我会尝试根据你的代码模板来修补 Syck。将测试并报告任何可行的方法。
    【解决方案2】:

    对于潜伏在周围的每个人来说,这看起来像是一个老错误。我刚刚尝试使用 ruby​​ 1.9.3,我得到了这个: [3] pry(main)> YAML.load(YAML.dump(/asd/m)) => /asd/m

    【讨论】:

    • 我知道旧的错误。问题是,如何在官方语言或库中修复它?特别是。晦涩难懂或不受欢迎的东西。我一点头绪都没有。
    • @Marcos,你的正则表达式是什么?使用 ruby​​ 的默认 YAML 转储和加载多行正则表达式对我有用 - 请参阅我的答案正文。顺便说一句,指定 m 标志似乎没有必要,因为它是 ruby​​ 中的默认值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多