2013-12-18 13 views
16

Korzystanie Ruby 1.9.3, Rails 3.2, mam następujący:Ruby gsub wiele znaków w ciąg

"every good boy does fine".gsub("every", "all").gsub("boy", "girl").gsub("fine", "well") 
# => "all good girl does well" 

Czy istnieje lepszy sposób to napisać? Dzięki.

Odpowiedz

19

String#gsub i Hash#fetch będzie dobrym wyborem.

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" 

lub

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" 
+1

mnie pokonać do tego :-( – bjhaid

+0

Sprytne użycie 'Regexp.union' jak kiedykolwiek ''no finer boy'.gsub (Regexp.union (* h.keys), h)' -> '" no wellr girl "' – Matt

+0

@Matt Dzięki za wskaźnik, naprawiłem to teraz .. –

2
replacements = [ ["every", "all"], ["boy", "girl"],["fine", "well"] 
replacements.each {|replacement| str.gsub!(replacement[0], replacement[1])} 

Nie wiem, czy jest lepszy, ale znacznie czystszy.

0

Jeśli zamiarem jest unikanie sposób Łańcuch:

[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" 

alternatywnie:

[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" 
1
subs = { "every" => "all", "boy" => "girl", "fine" => "well" } 
"every good boy does fine".gsub(/\w+/) { |m| subs[m] || m } 
# => 'all good girl does well' 
+0

'subs [m] || M 'znacznie lepiej niż' h.has_key? (m)? h [m]: m' .. Zapomniałem o tym, ale przypominasz mi .. :) –

+1

'subs.default_proc = -> (h, k) {k}' to inna opcja, to możesz po prostu powiedzieć '{| m | subs [m]} 'i ukrywa warunek za' default_proc'. –

+0

@muistooshort Lepsze jest 'a.gsub (/ \ w + /) {| m | h.fetch (m, m)} :) :) Zobacz moją edycję. –

0

po prostu zrób to:

"każdy dobry chłopak ma się dobrze" .gsub (/ \ w + /, "każdy" => "wszystko", "chłopiec" => "dziewczyna", "dobrze" => "dobrze")

dużo łatwiejszy do czytania :) niektóre odpowiedzi tutaj, aby to proste pytanie naprawdę sprawiają, że zastanawiam się ... lol

oto referencyjny: http://ruby-doc.org/core-2.1.4/String.html

gg

Powiązane problemy