构建通过匹配分隔字符串而创建的子字符串列表

时间:2015-06-26 13:09:18

标签: ruby string

我有一个字符串:

"a_b_c_d_e"

我想构建一个子字符串列表,这个子字符串是从字符串中删除单个"_"之后的所有内容。结果列表如下所示:

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

实现这一目标的最红宝石的方法是什么?

4 个答案:

答案 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"]

它适用于带有单词的数组 - 在这种情况下只有一个。大多数工作是移除和重新放置下划线。