我有一个字符串:
"a_b_c_d_e"
我想构建一个子字符串列表,这个子字符串是从字符串中删除单个"_"
之后的所有内容。结果列表如下所示:
['a_b_c_d', 'a_b_c', 'a_b', 'a']
实现这一目标的最红宝石的方法是什么?
答案 0 :(得分:8)
s = "a_b_c_d_e"
a = []
s.scan("_"){a << $`} #`
a # => ["a", "a_b", "a_b_c", "a_b_c_d"]
答案 1 :(得分:3)
您可以将split
下划线字符上的字符串Array
改为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"]
。然后丢弃数组的最后一个元素,并收集由下划线连接的另一个数组中的剩余元素。像这样:
/
希望这有帮助。
答案 2 :(得分:3)
我不确定“最红宝石”,我的解决方案是:
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
答案 3 :(得分:1)
Ruby附带了abbreviation的模块。
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"]
它适用于带有单词的数组 - 在这种情况下只有一个。大多数工作是移除和重新放置下划线。