2012-08-30 22 views
14

क्या रूबी की String#gsub विधि प्रतिस्थापन की अनुक्रमणिका सहित एक साधन प्रदान करती है? उदाहरण के लिए, निम्नलिखित स्ट्रिंग दी गई:सूचकांक/ऑफसेट के साथ रूबी जीएसबी?

मुझे आपको पसंद है, आप, आप और आप।

मैं इस निर्गम के साथ खत्म करना चाहते हैं:

मैं you1, You2, you3, और you4 पसंद है।

मैं जानता हूँ कि मैं कोष्ठक में पात्रों मिलान के लिए \1, \2, आदि का उपयोग कर सकते है, लेकिन वहाँ \i या \n की तरह कुछ भी है कि वर्तमान मैच की संख्या प्रदान करेगा है?

यह उल्लेखनीय है कि मेरा वास्तविक शब्द "आप" जितना आसान नहीं है, इसलिए एक वैकल्पिक दृष्टिकोण जो खोज शब्द मानता है वह स्थिर नहीं होगा।

+0

उदाहरण कोड यह मानते हुए कि आपके द्वारा किसी भी आवश्यक लक्ष्य या रेगेक्स को प्रतिस्थापित करने के लिए आसानी से संशोधित किया गया है। –

उत्तर

35

हम कर सकते हैं श्रृंखला में पारित कर दिया के अंदर बढ़ाने के लिए उपयोग कर सकते with_indexgsub() को पाने के लिए:

foo = 'I like you, you, you, and you.'.gsub(/\byou\b/).with_index { |m, i| "#{m}#{1+i}" } 
puts foo 

जो आउटपुट:

I like you1, you2, you3, and you4. 
+1

समस्या को हल कर सकता हूं वास्तव में अच्छा। +1 – apneadiving

+2

दोनों 'प्रत्येक_with_index' और' with_index' दोनों unsung-heroes हैं। –

+0

मैं स्वीकार करता हूं कि मैंने नवीनतम को अनदेखा किया! – apneadiving

3

यह काम करता है लेकिन यह बदसूरत है:

n = 0; 
"I like you, you, you, and you.".gsub("you") { val = "you" + n.to_s; n+=1; val } 
=> "I like you0, you1, you2, and you3." 
+0

क्या होगा अगर प्रतिस्थापन स्ट्रिंग में \ 1 के साथ मूल्य भी शामिल हों? मिलान किए गए स्ट्रिंग में $ 1 के साथ मैं इसे कैसे ठीक से बदल सकता हूं? उदाहरण: "हैलो" .gsub (/ (ello) /, "i और h \ 1") "हाय और हैलो" का उत्पादन करेगा। मैं इन प्रतिस्थापन को ब्लॉक के भीतर कैसे ले सकता हूं? –

3

यह एक छोटा सा hacky है, लेकिन आप एक चर है कि आप एक ब्लॉक gsub

source = 'I like you, you, you, and you.' 
counter = 1 
result = source.gsub(/you/) do |match| 
    res = "#{match}#{counter}" 
    counter += 1 
    res 
end 

puts result 
#=> I like you1, you2, you3, and you4. 
+1

वही (बदसूरत!) उत्तर, एक ही समय => +1 :) – apneadiving

+0

क्या होगा अगर प्रतिस्थापन स्ट्रिंग में '\ 1' जैसे मान भी शामिल हों? मिलान किए गए स्ट्रिंग में मैं '$ 1' के साथ इसे सही तरीके से कैसे बदल सकता हूं? उदाहरण: 'हैलो" .gsub (/ (ello) /, "i और h \ 1") 'हाय और हैलो "का उत्पादन करेगा। मैं इन प्रतिस्थापन को ब्लॉक के भीतर कैसे ले सकता हूं? –

+0

@MattHuggins: प्रत्येक समूह के लिए ब्लॉक कहा जाता है। 'I और h # {match}" का उपयोग करके आप जो भी –

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

  • कोई संबंधित समस्या नहीं^_^