एक स्ट्रिंग को एक रेगेक्स में बदलना


160

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

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

क्या आप यह देखने की कोशिश कर रहे हैं कि क्या फू गू का विकल्प है? मुझे नहीं लगता कि यह स्पष्ट है कि आप क्या पूछ रहे हैं।
नील सिप

यदि हां, तो goo.include? (Foo) पर्याप्त है!
ग्लेन mcdonald

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

जवाबों:



125

ध्यान दें कि Regexp.quoteमें जॉन एल के जवाब महत्वपूर्ण है!

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

यदि आप बस "स्पष्ट" संस्करण करते हैं:

if goo =~ /#{foo}/

तब आपके मिलान पाठ में अवधियों को रेग्जप वाइल्डकार्ड के रूप में माना जाता है, और "0.0.0.0"मेल खाएगा "0a0b0c0"

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

if goo.include?(foo)

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


3
ध्यान दें कि .quote()यदि आप स्ट्रिंग का उपयोग करके रेगेक्स का निर्माण करना चाहते हैं तो रिवर्स (उपयोग नहीं करना ) भी उपयोगी हो सकता है।
जेसी

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

बस जेसी को जोड़ने के मामले में यह स्पष्ट नहीं है, इसका मतलब है कि पात्रों के स्ट्रिंग को पास करने से आपको बचने की आवश्यकता नहीं है Regexp.newया Regexp.compile
dylankb

हम Regexp.quote का उपयोग क्यों करना चाहते हैं, इसकी उपयोगी व्याख्या के लिए धन्यवाद
व्यालियम जुड

7

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

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




3

यहाँ एक सीमित लेकिन उपयोगी अन्य उत्तर है:

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

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

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


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

-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 वाइल्डकार्ड हैं।
ग्लेन mcdonald
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.