Ruby gsub несколько символов в строке
Используя 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"
Есть ли лучший способ написать это? Спасибо.
Ответы
Ответ 1
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"
или,
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"
Ответ 2
replacements = [ ["every", "all"], ["boy", "girl"],["fine", "well"]
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])}
Я не знаю, было ли это лучше, но намного чище.
Ответ 3
subs = { "every" => "all", "boy" => "girl", "fine" => "well" }
"every good boy does fine".gsub(/\w+/) { |m| subs[m] || m }
# => 'all good girl does well'
Ответ 4
Если цель состоит в том, чтобы избежать цепочки методов:
[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"
В качестве альтернативы:
[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"
Ответ 5
просто выполните это:
"каждый хороший мальчик прекрасно справляется".gsub(/\ w +/, 'every' = > 'all', 'boy' = > 'girl', 'fine' = > 'well')
намного проще читать:)
некоторые ответы здесь на этот простой вопрос действительно заставляют меня задуматься... lol
здесь ссылка:
http://ruby-doc.org/core-2.1.4/String.html
гг