在Ruby中切换字符串中的每对字符

时间:2019-07-30 21:09:34

标签: ruby

我有一串数字07917142299099F0,我想交换每对字符。因此字符串变为701917249209990F。我还没有真正使用过Ruby,所以我不确定这是否可行。谢谢!

3 个答案:

答案 0 :(得分:5)

您可以使用正则表达式替换:

str.gsub(/(.)(.)/, '\2\1')

答案 1 :(得分:4)

您可以:

  • 从字符串中获取每个字符作为数组。
  • 将每对元素都放入其中。
  • 交换/反转它们(因为它们只有两个)。
  • 加入结果。

'07917142299099F0'
  .chars               # ["0", "7", "9", "1", "7", "1", "4", "2", "2", "9", "9", "0", "9", "9", "F", "0"]
  .each_slice(2)       #<Enumerator: ["0", "7", "9", "1", "7", "1", "4", "2", "2", "9", "9", "0", "9", "9", "F", "0"]:each_slice(2)>
  .flat_map(&:reverse) # ["7", "0", "1", "9", "1", "7", "2", "4", "9", "2", "0", "9", "9", "9", "0", "F"]
  .join                # "701917249209990F"

其他方式:

p str.gsub(/(.{2})/) { Regexp.last_match.to_s.reverse } # "701917249209990F"

请注意,如果字符串中的元素数量为奇数,这可能无法正常工作。

答案 2 :(得分:0)

尽管我更喜欢@Sagar的解决方案,但出于多样性的考虑,这是另一个。

def reverse_each_pair(str)
  nbr_even_chars = 2*(str.size/2)
  nbr_even_chars.times.with_object('') do |i,s|
    s[i] = str[i.odd? ? (i-1) : i+1]
  end << str[-1, str.size-nbr_even_chars]
end

reverse_each_pair '07917142299099F0'
  #=> "701917249209990F" 
reverse_each_pair '07917142299099F'
  #=> "70191724920999F"