在Ruby中从末尾切分字符串
如何将一个字符串拆分为多个等长但从后面的子字符串 例如,如果字符串为:在Ruby中从末尾切分字符串,ruby,string,split,substring,slice,Ruby,String,Split,Substring,Slice,如何将一个字符串拆分为多个等长但从后面的子字符串 例如,如果字符串为:“ABCDEFGH”,则我希望每个长度为3的字符串的数组为: ["FGH", "CDE", "AB"] 您可以使用每个片段来完成此操作,但需要先反转字符串,然后重新反转每个片段: x = "ABCDEFGH" x.chars.reverse.each_slice(3).map(&:reverse).map(&:join) => ["FGH", "CDE", "AB"] 将字符串拆分为字符数组(x.c
“ABCDEFGH”
,则我希望每个长度为3的字符串的数组为:
["FGH", "CDE", "AB"]
您可以使用
每个片段来完成此操作,但需要先反转字符串,然后重新反转每个片段:
x = "ABCDEFGH"
x.chars.reverse.each_slice(3).map(&:reverse).map(&:join)
=> ["FGH", "CDE", "AB"]
- 将字符串拆分为字符数组(
x.chars
)
- 反转数组(
.reverse
)
- 将数组切片为3个字符的子数组(
。每个切片(3)
)
- 反转每个子数组(
.map(&:reverse)
)
- 将每个子数组重新连接成一个字符串(
.map(&:join)
)
我认为这符合你的要求:
> "ABCDEFGH".reverse.scan(/.{1,3}/).each { |x| x.reverse! }
=> ["FGH", "CDE", "AB"]
下面是一个简短的解释:
.reverse
将字符串反转为“HGFEDCBA”
而不是“ABCDEFGH”
.scan(/.{1,3}/)
将字符串转换为数组,数组的每个元素包含3个字符(如果字符串不能被3整除,则数组的最后一个元素可能包含1或2个字符)
.each{| x | x.reverse!}
反转数组中每个元素中的字符
您可以定义如下函数:
def slice_string_from_end(s)
s.reverse.scan(/.{1,3}/).each { |x| x.reverse! }
end
然后您可以使用:
slice_string_from_end("ABCDEFGH")
同样有效,但正如@meagar指出的,您需要反转字符串,然后重新反转字符串:
"ABCDEFGH".reverse.split(/(...)/).reject(&:empty?).map(&:reverse)
# => ["FGH", "CDE", "AB"]
scan one不需要查找空字符串:
"ABCDEFGH".reverse.scan(/...?/).map(&:reverse)
# => ["FGH", "CDE", "AB"]
您可以将while
循环与一些切片算法结合使用:
s="ABCDEFGH"
li=[]
step=3
while s.length>0
ss=s[-(step<s.length ? step : s.length)..-1]
li << ss
s.chomp!(ss)
end
我不建议将其用于生产代码,它是一个密集的正则表达式,但它确实工作得很好。
s="ABCDEFGH"
li=[]
step=3
while s.length>0
ss=s[-(step<s.length ? step : s.length)..-1]
li << ss
s.chomp!(ss)
end
s="ABCDEFGH"
li=[]
step=3
reg=".{1,#{step}}$"
while s.length>0
ss=s[/#{reg}/]
li << ss
s.delete_suffix!(ss)
end
> li
=> ["FGH", "CDE", "AB"]