我有像name1="value1" name2='value2'这样的特殊字符串。值可以包含空格,并由单引号或双引号分隔。名称不能包含空格。名称/值对由空格分隔。
我想把它们解析成一个名值对列表,如下所示
string.magic_split() => { "name1"=>"value1", "name2"=>"value2" }如果Ruby理解lookaround断言,我可以这样做
string.split(/[\'\"](?=\s)/).each do |element|
element =~ /(\w+)=[\'\"](.*)[\'\"]/
hash[$1] = $2
end但是Ruby不理解lookaround断言,所以我有点卡住了。
然而,我相信无论如何都有更好的方法来解决这个问题,所以我求助于您。你有解决这个问题的好主意吗?
发布于 2010-10-27 22:02:42
这在“嗨”这样的值上失败了,但它可能已经足够好了。
str = %q(name1="value1" name2='value 2')
p Hash[ *str.chop.split( /' |" |='|="/ ) ]
#=> {"name1"=>"value1", "name2"=>"value 2"}发布于 2010-10-27 19:20:54
这并不是一个完整的答案,但是Oniguruma,1.9中的标准regexp库支持lookaround断言。如果您使用的是Ruby 1.8.x,则可以将其作为gem安装。
也就是说,正如Sorpigal所评论的那样,我倾向于一次迭代一个字符,而不是使用正则表达式,以跟踪您是否在名称部分,当您到达等号时,当您在引号中时,以及当您到达匹配的右引号时。在到达结束引号时,您可以将名称和值放入散列中,然后进入下一个条目。
发布于 2010-10-27 20:34:00
class String
def magic_split
str = self.gsub('"', '\'').gsub('\' ', '\'\, ').split('\, ').map{ |str| str.gsub("'", "").split("=") }
Hash[str]
end
endhttps://stackoverflow.com/questions/4032440
复制相似问题