चर नाम का उपयोग करके नियमित अभिव्यक्ति रूबी


105

क्या रूबी में एक नियमित अभिव्यक्ति पैटर्न बनाना / उपयोग करना संभव है जो एक चर नाम के मूल्य पर आधारित है?

उदाहरण के लिए, हम सभी जानते हैं कि हम रूबी स्ट्रिंग्स के साथ निम्नलिखित कर सकते हैं:

str = "my string"
str2 = "This is #{str}" # => "This is my string"

मैं नियमित भावों के साथ यही काम करना चाहता हूं:

var = "Value"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "a test foo"

जाहिर है कि सूचीबद्ध के रूप में काम नहीं करता है, मैं इसे केवल एक उदाहरण के रूप में यह दिखाने के लिए रखता हूं कि मैं क्या करना चाहता हूं। मुझे चर की सामग्री के मूल्य के आधार पर मैच को फिर से लिखने की जरूरत है।

जवाबों:


184

आपको लगता है कि कोड काम नहीं करता है:

var = "Value"
str = "a test Value"
p str.gsub( /#{var}/, 'foo' )   # => "a test foo"

यदि संस्करण नियमित अभिव्यक्ति मेटा-वर्णों को शामिल कर सकते हैं तो चीजें अधिक दिलचस्प हो जाती हैं। यदि ऐसा होता है और आप चाहते हैं कि वे जो कुछ भी करते हैं, वे आम तौर पर एक नियमित अभिव्यक्ति में करते हैं, तो वही gsub काम करेगा:

var = "Value|a|test"
str = "a test Value"
str.gsub( /#{var}/, 'foo' ) # => "foo foo foo"

हालाँकि, यदि आपके खोज स्ट्रिंग में मेटाचैकर्स हैं और आप नहीं चाहते कि उन्हें मेटाचैकर के रूप में व्याख्या की जाए, तो इस तरह से Regexp.escape का उपयोग करें:

var = "*This*"
str = "*This* is a string"
p str.gsub( /#{Regexp.escape(var)}/, 'foo' )
# => "foo is a string"

या बस एक नियमित अभिव्यक्ति के बजाय gsub को एक स्ट्रिंग दें। MRI> = 1.8.7 में, gsub एक स्ट्रिंग प्रतिस्थापन तर्क को एक सादे स्ट्रिंग के रूप में मानेगा, न कि एक नियमित अभिव्यक्ति:

var = "*This*"
str = "*This* is a string"
p str.gsub(var, 'foo' ) # => "foo is a string"

(यह हुआ करता था कि gsub के लिए एक स्ट्रिंग प्रतिस्थापन तर्क स्वचालित रूप से एक नियमित अभिव्यक्ति में बदल गया था। मुझे पता है कि यह 1.6 में इस तरह था। मुझे याद नहीं है कि किस संस्करण ने बदलाव पेश किया है)।

अन्य उत्तरों के अनुसार, आप प्रक्षेप के विकल्प के रूप में Regexp.new का उपयोग कर सकते हैं:

var = "*This*"
str = "*This* is a string"
p str.gsub(Regexp.new(Regexp.escape(var)), 'foo' )
# => "foo is a string"

4
Regexp.escape पर संकेत सिर्फ वही था जो मुझे नहीं पता था कि मुझे ज़रूरत है। धन्यवाद!
जेफ पैक्वे

regxPlayerVariable = '(। *?? =। *? document \ .getElementById (# {pluginPlayeVariable})' इसमें मैंने ऊपर सभी को लागू किया लेकिन ये काम नहीं कर रहे हैं।
एसएसपी

1
@SSP एक अलग प्रश्न में परेशानी की व्याख्या करना अच्छा हो सकता है।
वेन कॉनराड

13

यह काम करता है, लेकिन आपको gsub!दूसरे चर पर रिटर्न का उपयोग या असाइन करने की आवश्यकता है

var = "Value"
str = "a test Value"
str.gsub!( /#{var}/, 'foo' )  # Or this: new_str = str.gsub( /#{var}/, 'foo' )
puts str


6

आप रूबी में चर के माध्यम से नियमित अभिव्यक्ति का उपयोग कर सकते हैं:

var = /Value/
str = "a test Value"
str.gsub( /#{var}/, 'foo' )

1
मुझे यकीन नहीं है कि यह केवल गिरावट क्यों है मैंने इसे आज़माया और यह काम करता है, भले ही आपको varचर और gsub के पहले पैरामीटर में रेगेक्स स्लैश की आवश्यकता न हो ।
टायलर कोलियर

मुझे लगता है कि gsub में स्लैश का बिंदु यह दिखाना था कि एक रेगेक्स में एक वैरिएबल हो सकता है जो स्वयं एक रेग्क्स है। चर को स्ट्रिंग प्रकार का नहीं होना चाहिए (और वास्तव में, वेगेन के उत्तर में उल्लिखित कारणों से रेगेक्स बेहतर है)।
Mahemoff

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