我使用的是Ruby 2.4。我有一个包含字符串数据元素的数组,看起来像
["a word1 word2", "b eff", "a idaho orange", "new old shoe", "b mars", ...]
我想从上面形成两个数组,将一个函数(.split(/^(a|b)[[:space]]*/i
)应用于数组的每个元素。但是,我无法弄清楚如何形成两个独立的数组。以下
arr.map{ |x| x.split(/^(a|b)[[:space]]*/i) }
仅导致单个数组,并且每个元素前面都有一个空白元素。理想情况下,我希望输出为两个数组,如
["a", "b", "a", "", "b", ...]
["word1 word2", "eff", "idaho orange", "new old shoe", "mars", ...]
答案 0 :(得分:2)
试试这个
arr.map { |x| a, b, c = x.partition(/^[ab]\s+/); [b.strip, a + c] }.transpose
这是如何运作的?
partition
将字符串拆分为匹配前,匹配和匹配后b.strip
是没有尾随空格的匹配a + c
是完整字符串(如果匹配前匹配的完整字符串不匹配)或匹配后[..., ...]
创建一个元组,从而创建一个元组数组transpose
切换2D数组的行和列答案 1 :(得分:2)
这是我能找到的最短的:
a1, a2 = arr.map{ |x| x.match(/((?:^[ab](?= ))?) *(.*)/).captures}.transpose
此示例现在适用于"activity"
或"ball"
。它检查在字符串开头a
或b
后是否紧跟一个空格。
另一种变体是:
a1, a2 = arr.map do |x|
parts = x.split(/(?<=^a|^b) +/)
parts.unshift('') if parts.size == 1
parts
end.transpose