我认为开始与子阵并以":/desc"
结尾,并且不包含":/desc"
的其他实例。请注意,如果返回arr = [":desc:", ":desc:", ":/desc"]
,[a]
。我对数组的结构没有任何假设(但我没有测试过所有的可能性)。如果做出某些假设(存在匹配的非重叠对,例如简化是可能的。
代码
def extract(arr, target_start, target_end)
arr.select { |s| (s == target_start)..(s == target_end) ? true : false }.
slice_when { |s,t| [s, t] == [target_end, target_start] }.
to_a.
tap { |a| a.pop unless a.last.last == target_end }
end
例子
target_start = ":desc:"
target_end = ":/desc"
arr = ["hello", ":desc:", "claire", "et", "concise", ":/desc",
":desc:", "claire", "caca", "concise", "test", ":/desc"]
extract(arr, target_start, target_end)
#=> [[":desc:", "claire", "et", "concise", ":/desc"],
# [":desc:", "claire", "caca", "concise", "test", ":/desc"]]
arr = ["hello", ":desc:", "claire", "et", "concise", ":/desc", "wanda",
":desc:", "claire", "caca", "concise", "test", ":/desc", "herb"]
extract(arr, target_start, target_end)
# => [[":desc:", "claire", "et", "concise", ":/desc"],
# [":desc:", "claire", "caca", "concise", "test", ":/desc"]]
arr = ["hello", ":desc:", "claire", "et", "concise", ":/desc",
":desc:", "claire", "caca", "concise", "test"]
extract(arr, target_start, target_end)
#=> [[":desc:", "claire", "et", "concise", ":/desc"]]
arr = ["hello", ":desc:", "claire", "et", "concise", ":desc:", "claire",
"caca", "concise", "test"]
extract(arr, target_start, target_end)
#=> []
说明
考虑
arr = ["hello", ":desc:", "claire", "et", "concise", ":/desc",
":desc:", "claire", "caca", "concise", "test"]
和target_start
和target_end
如在示例中给出的。步骤如下。
b = arr.select { |s| (s == target_start)..(s == target_end) ? true : false }
#=> [":desc:", "claire", "et", "concise", ":/desc", ":desc:", "claire",
# "caca", "concise", "test"]
该第一步骤,其利用Ruby的flip-flop operator的,返回包含除那些先于第一":desc:"
和arr
所有元素那些每个":/desc"
和跟随第一":desc:"
之间的阵列。
接下来我们使用Enumerable#slice_when(Ruby v2.2中的新增功能)来生成根据需要切片b
的枚举器,然后将该枚举器转换为数组。
c = b.slice_when { |s,t| [s, t] == [target_end, target_start] }
#=> #<Enumerator: #<Enumerator::Generator:0x00000001dd4f18>:each>
d = c.to_a
#=> [[":desc:", "claire", "et", "concise", ":/desc"],
# [":desc:", "claire", "caca", "concise", "test"]]
的最后一步是去除d
最后一个数组,如果它不与":/desc"
,这是这里的情况下终止。我们可以使用,但不能直接返回弹出的元素,这也会导致该方法返回该值。但是,如果我们在Object#tap块中使用它,一切都很好。
d.tap { |a| a.pop unless a.last.last == target_end }
#=> [[":desc:", "claire", "et", "concise", ":/desc"]]
难道是错字吗?数组元素是'“:/ desc”'但你有'end_element =“:/ desc:'' – Marco