String#gsub 保持大小写?

String#gsub to maintain case?

使用gsub时,是否可以保持大小写?

这是工作示例,可以在不调用 gsub 两次的情况下执行此操作吗?也许在正则表达式中添加不区分大小写的 i?

 'Strings'.gsub(/s/, 'z').gsub(/S/, 'Z') #=> Ztringz

目标(显然行不通):

'Strings'.gsub(/s/i, 'z') #=> Ztringz

如何使用String#tr:

'Strings'.tr('sS', 'zZ')
# => "Ztringz"

三种使用方式String#gsub:

用一个块和一个简单的条件表达式

'Strings'.gsub(/s/i) { |str| str=='s' ? 'z' : 'Z' }
  #=> "Ztringz" 

带块和ASCII值偏移量

offset = 'z'.ord-'s'.ord 
  #=> 7
'Strings'.gsub(/s/i) { |str| (str.ord + offset).chr } 
  #=> "Ztringz" 

块也可以写成:

{ ($&.ord + offset).chr } 

具有默认值的散列

'Strings'.gsub(/s/i, Hash.new { |_,k| k }.update('s'=>'z', 'S'=>'Z'))
  #=> "Ztringz"