2010-08-06 4 views
36
में एक स्ट्रिंग से एक केस-संवेदी नियमित अभिव्यक्ति बनाएं

मान लीजिए कि मैंरूबी

`A man + a plan * a canal : Panama!` 

की तरह एक मनमाना स्ट्रिंग है और मैं तार उस मामले से ही अन्य कर रहे हैं के लिए एक regex खोज करना चाहते है कि करते हैं। यही कारण है, यह नियमित अभिव्यक्ति स्ट्रिंग

`a man + A PLAN * a canal : PaNaMa!` 

मैं इसे ले सबसे अच्छा तरीका रूबी नियमित अभिव्यक्ति में एक विशेष अर्थ के साथ हर चरित्र बैकस्लैश-से बचने के लिए है, और फिर तर्क के रूप में है कि तार के साथ Regexp.new और Regexp::IGNORECASE कर से मेल खाना चाहिए । क्या वह सही है? शाब्दिक नियमित अभिव्यक्तियों में मनमाने ढंग से तारों को बदलने के लिए एक कोशिश की गई और सही नियमित अभिव्यक्ति है?

वैसे, मैं आखिरकार इस नियमित अभिव्यक्ति का उपयोग मनमाने ढंग से केस-असंवेदनशील मोंगोडीबी क्वेरी करने के लिए करना चाहता हूं। तो अगर कोई और तरीका है तो मैं ऐसा कर सकता हूं, कृपया मुझे बताएं।

उत्तर

40

आप स्ट्रिंग में सभी वर्णों से बचने के लिए Regexp.escape का उपयोग कर सकते हैं जो अन्यथा विशेष रूप से regexp इंजन द्वारा संभाला जाएगा।

Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), Regexp::IGNORECASE) 

या

Regexp.new(Regexp.escape("A man + a plan * a canal : Panama!"), "i") 
+0

धन्यवाद, यही वह था जो मैं ढूंढ रहा था! (हालांकि मोंगोडीबी के रूप में, मुझे एहसास हुआ कि अगर मैं अक्सर इस तरह की खोज कर रहा हूं, तो मुझे वास्तव में प्रदर्शन कारणों से स्ट्रिंग का एक संक्षिप्त संस्करण स्टोर करना चाहिए।) –

22

आप नियमित अभिव्यक्ति आप पहले से ही जाना है तो आप "i" अभिव्यक्ति के बाद (जैसे /the center cannot hold it is too late/i) यह case insensitive बनाने के लिए जोड़ सकते हैं।

+3

ठीक है, लेकिन यह सवाल मैं पूछ रहा हूं। मेरे पास एक मनमानी स्ट्रिंग है (उपयोगकर्ता इनपुट से), नियमित अभिव्यक्ति नहीं। यदि उपयोगकर्ता 'ए + बी' में प्रवेश करता है, उदाहरण के लिए, मैं 'ए + बी', 'ए + बी', या 'ए + बी', 'aaaaab' नहीं ढूंढ पा रहा हूं। –

6

एक से थोड़ा अधिक वाक्यात्मक-मीठा तरीका यह है Regexp शाब्दिक के लिए %r संकेतन का उपयोग करने के लिए है:

input_str = "A man + a plan * a canal : Panama!" 
%r(#{Regexp.escape(input_str)})i 

बेशक यह व्यक्तिगत पसंद करने के लिए नीचे आता है।

37

रुबी रेगेक्स #{} नोटेशन का उपयोग करते हुए तारों को उसी तरह अभिव्यक्त कर सकते हैं। हालांकि, आपको किसी भी रेगेक्स विशेष पात्रों से बचना होगा। उदाहरण के लिए:

input_str = "A man + a plan * a canal : Panama!" 
/#{Regexp.escape input_str}/i 
+2

यह इतना अच्छा जवाब है - यह शीर्ष मतदान प्रतिक्रिया से बेहतर तरीके से पढ़ता है और बूट करने के लिए रूबी की तरह मुझे लगता है। आशा है कि दूसरों को भी यह ऊपर उठाएगा .. –