एक स्ट्रिंग को नियमित अभिव्यक्ति रूबी में बदलें


118

मुझे स्ट्रिंग को "/ [\ w \ s] + /" को नियमित अभिव्यक्ति में बदलने की आवश्यकता है।

"/[\w\s]+/" => /[\w\s]+/

मैंने विभिन्न Regexpतरीकों का उपयोग करने की कोशिश की जैसे:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//, इसी तरह Regexp.compileऔर Regexp.escape। लेकिन उनमें से कोई भी मेरी उम्मीद के मुताबिक नहीं लौटा।

इसके अलावा मैंने बैकस्लैश हटाने की कोशिश की:

Regexp.new("[\w\s]+") => /[w ]+/ लेकिन किस्मत नहीं।

फिर मैंने इसे सरल करने की कोशिश की:

str = "[\w\s]+"
=> "[w ]+"

यह बच जाता है। अब स्ट्रिंग कैसे रह सकती है क्योंकि यह है और एक regexp ऑब्जेक्ट में परिवर्तित होता है?

जवाबों:


149

ऐसा लगता है कि यहाँ आपको एकल उद्धरण में प्रारंभिक स्ट्रिंग की आवश्यकता है ( इस पृष्ठ को देखें )

>> str = '[\w\s]+'
 => "[\\w\\s]+" 
>> Regexp.new str
 => /[\w\s]+/ 

137

स्पष्ट होना

  /#{Regexp.quote(your_string_variable)}/

काम भी कर रहा है

संपादित करें: Regexp.quote में your_string_variable को लिपटे, शुद्धता के लिए।


3
बस पता चला है कि आप इस तरह से विकल्पों को जोड़ नहीं सकते हैं , जैसे /#{your_regex}/#{options}
प्यूडरस्टेलर

मुझे लगता है कि आप रेल के बारे में बात कर रहे हैं? optionsएक हैश है, और रूबी गतिशील नहीं है =)
सर्गेई गेरासिमोव

2
यह वह नहीं करता है जो ओपी रूबी 2.1 पर पूछ रहा है, यह "[\ w \ s] +" => / [[w] + /
लुका स्पिलर

1
कृपया ध्यान दें कि उत्तर वर्ष 2012 में दिया गया था :) उस समय सब कुछ सही था
सर्गेई गेरासिमोव

4
यह एक आदर्श वर्ष था।
नातपुली केय

35

यह विधि विशेष अर्थ के साथ सभी वर्णों से सुरक्षित रूप से बच जाएगी:

/#{Regexp.quote(your_string)}/

उदाहरण के लिए, .बच जाएगा, क्योंकि यह अन्यथा 'किसी भी चरित्र' के रूप में व्याख्या करता है।

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


2
अच्छा लगा क्योंकि यह बताता है कि हम स्ट्रिंग चर की रक्षा कैसे कर सकते हैं जिसमें संकेत शामिल हो सकते हैं (जैसे कि +.) जिसे रेक्सएक्सप में व्याख्या किया जाएगा।
राच्यमौरियर

1
यह वह नहीं करता है जो ओपी रूबी 2.1 पर पूछ रहा है, यह "[\ w \ s] +" => / [[w \] \ + /
लुका स्पिलर

@ LUCSpiller आपको एक एकल-उद्धृत स्ट्रिंग का उपयोग करने की आवश्यकता है, बैकस्लैश को दोहरे-उद्धृत स्ट्रिंग्स में एक विशेष चरित्र के रूप में माना जाता है, यही वजह है कि उदा "\n"एक नई पंक्ति है, लेकिन '\n'ऐसा नहीं है।
सैंडस्ट्रॉम

8

% अंकन का उपयोग करना:

%r{\w+}m => /\w+/m

या

regex_string = '\W+'
%r[#{regex_string}]

से मदद :

% r [] इंटरगेनेटेड रेगेक्सप (झंडे समापन के बाद दिखाई दे सकते हैं)


यह वह नहीं करता है जो ओपी रूबी 2.1 पर पूछ रहा है, यह "[\ w \ s] +" => / / [ws] + /
लुका स्पिलर

1
@ ल्यूका स्पिलर, धन्यवाद, सिंगल कोट्स का इस्तेमाल किया जाना चाहिए, मैं जवाब अपडेट करूंगा।
बिटऑफयूनिवर्स

5

मणि to_regexp काम कर सकता है।

"/[\w\s]+/".to_regexp => /[\w\s]+/

आप संशोधक का उपयोग भी कर सकते हैं:

'/foo/i'.to_regexp => /foo/i

अंत में, आप का उपयोग करके अधिक आलसी हो सकते हैं: पता लगाएं

'foo'.to_regexp(detect: true)     #=> /foo/
'foo\b'.to_regexp(detect: true)   #=> %r{foo\\b}
'/foo\b/'.to_regexp(detect: true) #=> %r{foo\b}
'foo\b/'.to_regexp(detect: true)  #=> %r{foo\\b/}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.