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

时间:2015-11-04 11:26:03

标签: ruby regex case-sensitive gsub 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")那样指定它们?

4 个答案:

答案 0 :(得分:2)

您可以使用哈希。例如:

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

答案 1 :(得分:2)

不是您的问题的答案,而是更多其他方法:使用translation

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

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

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

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

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

答案 2 :(得分:1)

以下是@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将来可能发生变化,这些可提供更好的可维护性

答案 3 :(得分:0)

你也可以传递gsub一个块

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

在这种情况下,哈希的使用当然要优雅得多,但是如果你有复杂的替换规则,那么将一个类专用于它就会派上用场。

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