我認爲開始與子陣並以":/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