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"
使用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"