我有一个包含以下内容的数组:
[["< start >", "The < object > < verb > tonight."],
["< object >", "waves", "big yellow flowers", "slugs"]]
我想创建一个会返回的哈希
{"< start >"=>[["The", "< object >", "< verb >", "tonight."]],
"< object >"=>[["waves"], ["big", "yellow", "flowers"], ["slugs"]]}
我想做某种匹配key.to_s.match(/<?>/),但我不确定如何实现。完整的菜鸟
arr = [["< start >", "The < object > < verb > tonight."],
["< object >", "waves", "big yellow flowers", "slugs"]]
arr.each_with_object({}) { |(first, *rest),h|
h[first] = rest.map { |s| s.scan(/< S+ >|S+/) } }
#=> {"< start > "=>[["The", "< object >", "< verb >", "tonight."]],
# "< object >"=>[["waves"], ["big", "yellow", "flowers"], ["slugs"]]}.
你需要稍微改变你的输入,但你可能想要Hash#[]
(文档)。
例:
arry = [["key1", "val1"], ["key2", "val2"]]
Hash[arry]
# => {"key1"=>"val1", "key2"=>"val2"}
因此,您需要将数组调整为键和值对的数组。
input = [
["< start >", "The < object > < verb > tonight."],
["< object >", "waves", "big yellow flowers", "slugs"]
]
massaged_input = input.map{|arry| [arry.slice!(0), arry.join.squeeze(" ")] }
# => [["< start >", "The < object > < verb > tonight."], ["< object >", "wavesbig yellow flowersslugs"]]
Hash[massaged_input]
# => {"< start >"=>"The < object > < verb > tonight.", "< object >"=>"wavesbig yellow flowersslugs"}
这就是我将如何处理这个特定示例
a = [["< start >", "The < object > < verb > tonight."],
["< object >", "waves", "big yellow flowers", "slugs"]]
a.each_with_object({}) { |(k,*v), obj| obj[k] = v.map { |a| a.scan(/<sw+s>|w+/) } }
#=> {"< start >"=>[["The", "< object >", "< verb >", "tonight"]],
# "< object >"=>[["waves"], ["big", "yellow", "flowers"], ["slugs"]]}
这只是使用一个简单的正则表达式将字符串解析为请求的格式。
代码示例
正则表达式:/<sw+s>|w+/
- 匹配
<sw+s>
-
<
(文字) -
s
空间 -
w+
一个或多个单词字符(字母、数字、下划线) -
s
空间 -
>
(文字)
-
-
|
或 - 匹配
w+
一个或多个单词字符(字母、数字、下划线)
正则表达式示例