gsub 方法和正则表达式(区分大小写和不区分大小写)

gsub method and regex (case sensitive and case insensitive)

在ruby中,我想替换字符串中的一些字母,有更好的方法吗?

string = "my random string"
string.gsub(/a/, "@").gsub(/i/, "1").gsub(/o/, "0")`

如果我想用“@”替换 "a" 和 "A",我知道我可以做到 .gsub(/a/i, "@"),但是如果我想替换每个 "a" 与 "e" 和每个 "A" 与 "E"?有没有办法抽象它而不是像 .gsub(/a/, "e").gsub(/A/, "E")?

那样指定两者

您可以使用哈希。例如:

h = {'a' => '@', 'b' => 'B', 'A' => 'E'}
"aAbBcC".gsub(/[abA]/, h)
# => "@EBBcC" 

不是您问题的真正答案,而是另一种继续进行的方式:使用 translation:

'aaAA'.tr('aA', 'eE')
# => 'eeEE'

对于相同的转换,您还可以使用 ascii table:

'aaAA'.gsub(/a/i) {|c| (c.ord + 4).chr}
# => 'eeEE'

其他示例(默认使用最后一个字符):

'aAaabbXXX'.tr('baA', 'B@')
# => '@@@@BBXXX'

你也可以给gsub传递一个块

"my random string".gsub(/[aoi]/) do |match|  
  case match; when "a"; "@"; when "o"; "0"; when "i"; "I" end
end
# => "my r@nd0m strIng"

在这种情况下,使用散列当然要优雅得多,但如果您有复杂的替换规则,可以派上用场,为它指定一个 class。

"my random string".gsub(/[aoi]/) {|match| Substitute.new(match).result}  
# => "my raws0m strAINng"

这是@Santosh 回答的两个变体:

str ="aAbBcC"
h = {'a' => '@', 'b' => 'B', 'A' => 'E'}

#1

str.gsub(/[#{h.keys.join}]/, h) #=> "@EBBcC"

#2

h.default_proc = ->(_,k) { k }
str.gsub(/./, h) #=> "@EBBcC"

这些提供了更好的可维护性,如果 h 将来可能会改变