[英]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
下划线字符上的字符串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"]
希望这可以帮助。
我不确定“最红宝石”,我的解决方案是:
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.