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