首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Ruby多字符串替换

Ruby多字符串替换
EN

Stack Overflow用户
提问于 2011-11-15 14:47:27
回答 6查看 69.1K关注 0票数 85
代码语言:javascript
复制
str = "Hello☺ World☹"

预期输出为:

代码语言:javascript
复制
"Hello:) World:("

我可以这样做:str.gsub("☺", ":)").gsub("☹", ":(")

有没有其他方法可以让我在一次函数调用中完成这项工作?类似于:

代码语言:javascript
复制
str.gsub(['s1', 's2'], ['r1', 'r2'])
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-11-15 15:03:58

从Ruby1.9.2开始,String#gsub接受哈希作为第二个参数,用于替换为匹配的键。您可以使用正则表达式来匹配需要替换的子字符串,并传递要替换的值的哈希。

如下所示:

代码语言:javascript
复制
'hello'.gsub(/[eo]/, 'e' => 3, 'o' => '*')    #=> "h3ll*"
'(0) 123-123.123'.gsub(/[()-,. ]/, '')    #=> "0123123123"

在Ruby 1.8.7中,您可以使用块实现相同的功能:

代码语言:javascript
复制
dict = { 'e' => 3, 'o' => '*' }
'hello'.gsub /[eo]/ do |match|
   dict[match.to_s]
 end #=> "h3ll*"
票数 126
EN

Stack Overflow用户

发布于 2011-11-15 15:14:10

设置映射表:

代码语言:javascript
复制
map = {'☺' => ':)', '☹' => ':(' }

然后构建一个正则表达式:

代码语言:javascript
复制
re = Regexp.new(map.keys.map { |x| Regexp.escape(x) }.join('|'))

最后是gsub

代码语言:javascript
复制
s = str.gsub(re, map)

如果你被困在1.8版本中,那么:

代码语言:javascript
复制
s = str.gsub(re) { |m| map[m] }

如果要替换的任何内容在正则表达式中具有特殊含义,则需要在其中包含Regexp.escape。或者,多亏了steenslag,你可以使用:

代码语言:javascript
复制
re = Regexp.union(map.keys)

我们将为您处理报价事宜。

票数 42
EN

Stack Overflow用户

发布于 2011-11-15 14:56:26

你可以这样做:

代码语言:javascript
复制
replacements = [ ["☺", ":)"], ["☹", ":("] ]
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}

可能有一种更有效的解决方案,但这至少使代码更简洁一些

票数 38
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8132492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档