如何将字符串拆分为多个长度相等但从后面的子字符串?
例如,如果string是:"ABCDEFGH"
,那么我想要一个长度为3的每个字符串的数组:
["FGH", "CDE", "AB"]
答案 0 :(得分:3)
我认为这就是你所要求的:
> "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")
答案 1 :(得分:2)
您可以使用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)
)答案 2 :(得分:2)
"ABCDEFGH".scan(/.+?(?=(?:.{3})*\z)/) # => ["AB", "CDE", "FGH"]
"ABCDEFGH".scan(/.+?(?=(?:.{3})*\z)/).reverse # => ["FGH", "CDE", "AB"]
答案 3 :(得分:0)
split
和scan
也有效,但是像@meagar指出的那样,你需要反转然后重新反转字符串:
"ABCDEFGH".reverse.scan(/...?/).map(&:reverse)
# => ["FGH", "CDE", "AB"]
扫描者不需要寻找空字符串:
var scienceQuestion = {
scienceQue: function(){
for (var i = 0; i <science.question.length; i++)
science.question = questionsDiv.innerHtml
},
science: [
{ question: "What size is",
choices: [10,44,15],
correctIndex: 1
},
{ question: "???",
choices: [0,1,2],
correctIndex: 2
}
]
}
答案 4 :(得分:0)
您可以使用带有一些切片算法的 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"]