2013-12-18 5 views
16

रूबी 1.9.3 का उपयोग में कई पात्रों, 3.2 रेल, मैं निम्नलिखित है:रूबी gsub स्ट्रिंग

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

वहाँ एक बेहतर तरीका यह लिखने के लिए है? धन्यवाद।

उत्तर

19

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

मुझे हरा इसके लिए :-( – bjhaid

+0

'Regexp.union' का चालाक उपयोग कैसे कभी '' कोई बेहतर boy'.gsub (Regexp.union (* h.keys), h) '->' "कोई अच्छी लड़की नहीं" ' – Matt

+0

@ मैट पॉइंटर के लिए धन्यवाद, मैंने इसे अभी तय कर दिया है .. –

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

मुझे नहीं पता कि यह बेहतर है, लेकिन बहुत साफ है।

0

आशय विधि श्रृंखलन से बचने के लिए है:

[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" 
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' h.has_key से कहीं बेहतर है? (एम)? एच [एम]: एम' .. मैं उसे भूल गया, लेकिन आप मुझे याद दिलाता है .. :) –

+1

'subs.default_proc = -> (एच, के) {के}' एक और विकल्प है, तो आप बस '{| मीटर | subs [m]} 'और' default_proc' के पीछे सशर्त छुपाएं। –

+0

@muistooshort अधिक बेहतर है 'a.gsub (/ \ w + /) {| m | एच। फ़ेच (एम, एम)} ':) मेरे संपादन को देखो। –

0

बस यह करें:

"हर अच्छा लड़का ठीक करता है" .gsub (/ \ w + /, 'हर' => 'all', 'boy' => 'girl', 'fine' => 'well')

बहुत आसान को पढ़ने के लिए :) इस सरल प्रश्न के उत्तर यहां से कुछ वास्तव में मुझे सोचने पर मजबूर ... lol

यहां संदर्भ है: http://ruby-doc.org/core-2.1.4/String.html

gg

संबंधित मुद्दे