[英]Ruby gsub multiple characters in string
Using Ruby 1.9.3, Rails 3.2, I have the following: 使用Ruby 1.9.3,Rails 3.2,我有以下内容:
"every good boy does fine".gsub("every", "all").gsub("boy", "girl").gsub("fine", "well")
# => "all good girl does well"
Is there a better way to write this? 有没有更好的方法来写这个? Thanks. 谢谢。
String#gsub
and Hash#fetch
will be the good choice for this. String#gsub
和Hash#fetch
将是这个的好选择。
a = "every good boy does fine"
h = {"every" => "all","boy" => "girl", "fine" =>"well" }
a.gsub(/\w+/) { |m| h.fetch(m,m)}
# => "all good girl does well"
or, 要么,
a = "every good boy does fine"
h = {"every" => "all","boy" => "girl", "fine" =>"well" }
Regexp.new("^#{h.keys.join('|')}$") # => /^every|boy|fine$/
a.gsub(Regexp.new("^#{h.keys.join('|')}$"),h)
# => "all good girl does well"
replacements = [ ["every", "all"], ["boy", "girl"],["fine", "well"]
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}
I don't know if its better, but much cleaner. 我不知道它是否更好,但更清洁。
subs = { "every" => "all", "boy" => "girl", "fine" => "well" }
"every good boy does fine".gsub(/\w+/) { |m| subs[m] || m }
# => 'all good girl does well'
just do this: 这样做:
"every good boy does fine".gsub(/\\w+/, 'every' => 'all', 'boy' => 'girl', 'fine' => 'well') “每个好男孩都做得很好”.gsub(/ \\ w + /,'every'=>'all','boy'=>'girl','fine'=>'well')
a lot easier to read :) some of the answers here to this simple question really make me wonder...lol 更容易阅读:)这个简单的问题的一些答案真的让我想知道...哈哈
here's the reference: http://ruby-doc.org/core-2.1.4/String.html 这里是参考: http : //ruby-doc.org/core-2.1.4/String.html
gg GG
If the intent is to avoid method chaining: 如果目的是避免方法链接:
[9] pry(main)> "every good boy does fine".gsub("every", "all").gsub("boy", "girl").gsub("fine", "well")
=> "all good girl does well"
[10] pry(main)> "every good boy does fine".gsub(/(every)|(boy)|(fine)/) do |word|
[10] pry(main)* case word
[10] pry(main)* when "every"
[10] pry(main)* "all"
[10] pry(main)* when "boy"
[10] pry(main)* "girl"
[10] pry(main)* when "fine"
[10] pry(main)* "well"
[10] pry(main)* end
[10] pry(main)* end
=> "all good girl does well"
Alternatively: 或者:
[11] pry(main)> REPLACEMENT = { "every" => "all", "boy" => "girl", "fine" => "well"}
=> {"every"=>"all", "boy"=>"girl", "fine"=>"well"}
[12] pry(main)> "every good boy does fine".gsub(/(every)|(boy)|(fine)/) { |word| REPLACEMENT[word] }
=> "all good girl does well"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.