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
将来可能会改变
在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
将来可能会改变