Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在多行正则表达式中读取TypeError_Ruby_Regex_Yaml_Psych_Syck - Fatal编程技术网

Ruby 在多行正则表达式中读取TypeError

Ruby 在多行正则表达式中读取TypeError,ruby,regex,yaml,psych,syck,Ruby,Regex,Yaml,Psych,Syck,文件中显然存储了一个多行正则表达式,由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: s

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

发生什么事了?还有希望吗?我之前对Syck、Psych和YAML解析的内部结构一无所知,直到这个错误使它变得不透明。

您可以将regexp存储为字符串。当您从yaml文件读回它时,只需将字符串转换回regexp
Regexp.new myregexp_str
——这当然只是一个解决办法

更新: 或者你可以做一些非常愚蠢的事情,修补psych来处理多行regexp。 因为补丁的方法太长了,所以要发布它,抓住它。 但这是真正修补的原因

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
心理模块
模块访问者
类ToRubyo、 value=~/^\/(.*)\/([mixn]*)$/m#您可以将regexp存储为字符串。当您从yaml文件读回它时,只需将字符串转换回regexp
Regexp.new myregexp_str
——这当然只是一个解决办法

更新: 或者你可以做一些非常愚蠢的事情,修补psych来处理多行regexp。 因为补丁的方法太长了,所以要发布它,抓住它。 但这是真正修补的原因

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
心理模块
模块访问者
类ToRubyo、 value=~/^\/(.*)\/([mixn]*)$/m#对于所有潜伏在周围的人来说,这看起来像一个老bug。我刚刚尝试使用ruby 1.9.3,我得到了以下结果:

[3] 撬(主)>YAML.负载(YAML.卸载(/asd/m))
=>/asd/m

对于所有潜伏在周围的人来说,这看起来像一个老bug。我刚刚尝试使用ruby 1.9.3,我得到了以下结果:

[3] 撬(主)>YAML.负载(YAML.卸载(/asd/m))
=>/asd/m

是的,但是对于任何我看不清楚的随机对象,我该怎么做呢?在本例中,
b1
是一个webdriver
Watir::Browser
类型object我想我不知道足够的Ruby来让它透明。也就是说,如何编写替代保存和加载(序列化和反序列化)例程,使其尽可能接近原始对象类型和内容。您是否尝试过使用
Marshal.dump
Marshal.load
似乎Marshal可以处理多行regexp,然而,Marshal甚至不会保存这个对象,因为其他原因:
TypeError:cannotdumptcpserver
,所以Yaml对我来说工作得更好。好建议,谢谢;Psych对我来说有一个不同的(更致命的)问题,所以我想我会尝试根据您的代码模板修补Syck。我会测试并报告任何有效的东西。是的,但是对于任何我不清楚的随机对象,我该怎么做呢?在本例中,
b1
是一个webdriver
Watir::Browser
类型object我想我不知道足够的Ruby来让它透明。也就是说,如何编写替代保存和加载(序列化和反序列化)例程,使其尽可能接近原始对象类型和内容。您是否尝试过使用
Marshal.dump
Marshal.load
似乎Marshal可以处理多行regexp,然而,Marshal甚至不会保存这个对象,因为其他原因:
TypeError:cannotdumptcpserver
,所以Yaml对我来说工作得更好。好建议,谢谢;Psych对我来说有一个不同的(更致命的)问题,所以我想我会尝试根据您的代码模板修补Syck。我会测试并报告任何有效的东西。我知道这个老错误。问题是,如何将其固定在官方语言或图书馆中?尤其是晦涩或不受欢迎的事物。“我没有什么线索。”马科斯,你的正则表达式是什么?使用ruby的默认YAML转储和加载多行正则表达式对我很有用-请参阅我的答案正文。顺便说一句,指定
m
标志似乎没有必要,因为这是ruby中的默认标志。我知道这个老错误。问题是,如何将其固定在官方语言或图书馆中?尤其是晦涩或不受欢迎的事物。“我没有什么线索。”马科斯,你的正则表达式是什么?使用ruby的默认YAML转储和加载多行正则表达式对我很有用-请参阅我的答案正文。顺便说一句,指定
m
标志似乎没有必要,因为这是ruby中的默认标志。