在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"]