在Ruby中从一端切割字符串

时间:2016-02-23 18:08:22

标签: ruby string split substring slice

如何将字符串拆分为多个长度相等但从后面的子字符串?

例如,如果string是:"ABCDEFGH",那么我想要一个长度为3的每个字符串的数组:

["FGH", "CDE", "AB"]

5 个答案:

答案 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
  • 将数组切片为3个字符(.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)

splitscan也有效,但是像@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"]