簡體   English   中英

通過匹配將字符串分開創建的子字符串的構建列表

[英]Build list of substrings created by separating a string by a match

我有一個字符串:

"a_b_c_d_e"

我想建立一個子字符串列表,該子字符串是從字符串中刪除單個"_"后的所有內容所導致的。 結果列表如下所示:

['a_b_c_d', 'a_b_c', 'a_b', 'a']

實現這一目標的最紅寶石方法是什么?

s = "a_b_c_d_e"
a = []
s.scan("_"){a << $`}                                                            #`
a # => ["a", "a_b", "a_b_c", "a_b_c_d"]

您可以split下划線字符上的字符串splitArray 然后丟棄該數組的最后一個元素,並將其余元素收集在下划線連接的另一個數組中。 像這樣:

str = "a_b_c_d_e"
str_ary = str.split("_") # will yield ["a","b","c","d","e"]
str_ary.pop # throw out the last element in str_ary
result_ary = [] # an empty array where you will collect your results
until str_ary.empty?
  result_ary << str_ary.join("_") #collect the remaining elements of str_ary joined by underscores
  str_ary.pop
end

# result_ary = ["a_b_c_d","a_b_c","a_b","a"]

希望這可以幫助。

我不確定“最紅寶石”,我的解決方案是:

str = 'a_b_c_d_e'

(items = str.split('_')).map.with_index do |_, i| 
  items.take(i + 1).join('_')
end.reverse
########################################################
(items = str.split('_')).size.downto(1).map do |e|
  items.take(e).join('_')
end
########################################################
str.split('_').inject([]) do |memo, l| 
  memo << [memo.last, l].compact.join('_') 
end.reverse
########################################################
([items]*items.size).map.with_index(&:take).map do |e| 
  e.join('_')
end.reject(&:empty?).reverse

我最喜歡的:

([str]*str.count('_')).map.with_index do |s, i| 
  s[/\A([^_]+_){#{i + 1}}/][0...-1]
end.reverse

Ruby附帶了一個縮寫模塊。

require "abbrev"

puts ["a_b_c_d_e".tr("_","")].abbrev.keys[1..-1].map{|a| a.chars*"_"}
# => ["a_b_c_d", "a_b_c", "a_b", "a"]

它適用於帶有單詞的數組-在這種情況下只有一個。 大多數工作是刪除並重新放置下划線。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM