2008-09-29 8 views
110

में स्ट्रिंग को इंटरपोल करना मुझे रूबी में मेरी नियमित अभिव्यक्ति में स्ट्रिंग के मान को प्रतिस्थापित करने की आवश्यकता है। क्या इसे करने का कोई आसान तरीका है?एक रेगेक्स

foo = "0.0.0.0" 
goo = "here is some other stuff 0.0.0.0" 
if goo =~ /value of foo here dynamically/ 
    puts "success!" 
end 
+0

क्या आप यह देखने की कोशिश कर रहे हैं कि foo goo का एक सबस्ट्रिंग है या नहीं? मुझे नहीं लगता कि यह स्पष्ट है कि आप क्या पूछ रहे हैं। – Neall

+0

यदि हां, तो goo.include? (Foo) पर्याप्त है! –

+1

नहीं, मैं यह देखने की कोशिश नहीं कर रहा था कि foo goo का एक सबस्ट्रिंग है या नहीं; मुझे कुछ कैप्चरिंग करने की भी आवश्यकता है, इसलिए इसमें काम नहीं किया गया। –

उत्तर

209

स्ट्रिंग सम्मिलन के समान।

if goo =~ /#{Regexp.quote(foo)}/ 
#... 
+9

वाह रूबी कोड में आंतरिक सौंदर्य है। – Fuser97381

3

उपयोग Regexp.new: उदाहरण के लिए:

if goo =~ Regexp.new(foo) # Evaluates to /0.0.0.0/ 
6

शायद Regexp.escape(foo) एक प्रारंभिक बिंदु होगा, लेकिन इसका कोई खास कारण आप अधिक परंपरागत अभिव्यक्ति-प्रक्षेप उपयोग नहीं कर सकते है: "my stuff #{mysubstitutionvariable}"?

इसके अलावा, आप केवल !goo.match(foo).nil? का उपयोग शाब्दिक स्ट्रिंग के साथ कर सकते हैं।

-2
foo = "0.0.0.0" 
goo = "here is some other stuff 0.0.0.0" 

puts "success!" if goo =~ /#{foo}/ 
+2

नहीं, यह "कुछ अन्य सामान 070x0! 0" के लिए एक गलत "सत्य" देगा, क्योंकि डॉट्स regexp वाइल्डकार्ड हैं। –

+0

अच्छी पकड़ ग्लेन। –

89

ध्यान दें कि Jon L.'s answer में Regexp.quote महत्वपूर्ण है!

if goo =~ /#{Regexp.quote(foo)}/ 

तुम सिर्फ "स्पष्ट" संस्करण करते हैं:

if goo =~ /#{foo}/ 

फिर अपने मैच पाठ में अवधि regexp वाइल्डकार्ड के रूप में इलाज कर रहे हैं, और "0.0.0.0""0a0b0c0" से मेल खाएगी।

यह भी ध्यान रखें कि यदि आप वास्तव में सिर्फ सबस्ट्रिंग मिलान के लिए जाँच करना चाहते हैं, तो आप बस कर सकते हैं

if goo.include?(foo) 

जो एक अतिरिक्त के हवाले से या विशेष वर्ण के बारे में चिंता की आवश्यकता नहीं है।

मैं मुझे पता चला कि मैं आसानी से Regexp.quote या Regexp.escape का उपयोग किए बिना एक regex में सम्मिलित कर सकते, तो मैं बस अपना इनपुट स्ट्रिंग पर एकल उद्धरण का इस्तेमाल किया:

+0

आह, महान पकड़ ग्लेन! धन्यवाद! –

+2

ध्यान दें कि रिवर्स ('.quote()' का उपयोग नहीं कर रहा है) यदि आप स्ट्रिंग का उपयोग कर रेगेक्स बनाने की सोच रहे हैं तो भी उपयोगी हो सकता है। – Jesse

+0

"यदि आप वास्तव में केवल एक सबस्ट्रिंग मैच की जांच करना चाहते हैं, तो आप goo.include कर सकते हैं?(foo) '" => सही है जब आप अस्तित्व की जांच में रुचि रखते हैं। यदि आप String.gsub को बदलने और पहले से ही उपयोग करने में रुचि रखते हैं, तो Regexp.quote आपका एकमात्र विकल्प हो सकता है। –

2

यहाँ एक सीमित लेकिन उपयोगी अन्य जवाब है (एक आईपी पता मिलान)

IP_REGEX = '\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}' 

my_str = "192.0.89.234 blahblah text 1.2, 1.4" # get the first ssh key 
# replace the ip, for demonstration 
my_str.gsub!(/#{IP_REGEX}/,"192.0.2.0") 
puts my_str # "192.0.2.0 blahblah text 1.2, 1.4" 

एकल उद्धरण केवल \\ और \ 'की व्याख्या करते हैं।

http://en.wikibooks.org/wiki/Ruby_Programming/Strings#Single_quotes

यह मैं मदद की जब मैं एक regex कई बार के एक ही लंबे हिस्से का उपयोग करने की जरूरत है। सार्वभौमिक नहीं है, लेकिन सवाल उदाहरण फिट बैठता है, मुझे विश्वास है।

+0

मुझे उत्सुकता है कि मेरी पोस्ट यहां क्या विचार की जाएगी, लेकिन मैं संदेह है कि अब यहां नीचे देखा जाएगा। – Plasmarob

+0

टिप्पणियां डाउनवोट की तुलना में कहीं अधिक उपयोगी हैं। – Plasmarob