如何将一个字符串从后往前分成多个等长的子字符串?
例如,如果字符串是:
例如,如果字符串是:
"ABCDEFGH"
,那么我想要一个长度为3的字符串数组,如下所示:["FGH", "CDE", "AB"]
我认为这个可以满足你的需求:
> "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")
each_slice
来实现这一点,但是您需要先反转字符串,然后再重新反转每个单独的片段:x = "ABCDEFGH"
x.chars.reverse.each_slice(3).map(&:reverse).map(&:join)
=> ["FGH", "CDE", "AB"]
x.chars
).reverse
).each_slice(3)
).map(&:reverse)
).map(&:join)
)"ABCDEFGH".scan(/.+?(?=(?:.{3})*\z)/) # => ["AB", "CDE", "FGH"]
"ABCDEFGH".scan(/.+?(?=(?:.{3})*\z)/).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
reg=".{1,#{step}}$"
while s.length>0
ss=s[/#{reg}/]
li << ss
s.delete_suffix!(ss)
end
无论哪种情况:
> li
=> ["FGH", "CDE", "AB"]