0

我正在使用的字符串示例:

s = "{new {value1 value2 value3}} {old {value2 value1 value1}} {{old school} {value2 value3 value1}}"

{} 受空格影响,这就是为什么“old school”被包围而“new”和“old”没有被包围的原因。

解析前两个(新旧)很容易使用s.split[1]访问“新”和s.split[3..5]值来完成。当“新”或“旧”有空间时,问题就来了,在这种情况下是“老派”。在我正在访问的数据库中,这些带有空格的名称是随机出现的。

我怎样才能改变我的解析来解释这些事件?

4

2 回答 2

0

你不想用正则表达式来解析它,你应该逐个字符地去记住你在括号层次结构中的位置。

这是我的解决方案:http: //pastebin.com/kLLnS5qB

(这只是一个粗略的剪辑,有些电话并不是很干,而且缺乏测试。)

$ ruby foo.rb 
[#<struct key="new", values=["value1", "value2", "value3"]>, #<struct key="old", values=["value2", "value1", "value1"]>, #<struct key="old school", values=["value2", "value3", "value1"]>]
于 2012-10-05T17:55:52.133 回答
0

你可以用这一行来做到这一点:

s.split("}} {").map{|x| x.split(" {")}.map{|x| x.map{|y| y.gsub("{","").gsub("}","")}}

有点难看,但适用于您的示例,返回:

[["new", "value1 value2 value3"], ["old", "value2 value1 value1"], ["old school", "value2 value3 value1"]]

然后,您可以通过将值分解为它们自己的对象等来进一步解析 if。如果您希望它作为散列,您可以像这样得到它:

Hash[s.split("}} {").map{|x| x.split(" {")}.map{|x| x.map{|y| y.gsub("{","").gsub("}","")}}]

这将返回:

{"new"=>"value1 value2 value3", "old"=>"value2 value1 value1", "old school"=>"value2 value3 value1"} 
于 2012-10-05T18:13:13.327 回答