2009-08-01 17 views
7

में डायनामिक रेगेक्स मैं एक स्ट्रिंग (डेटाबेस से लिया गया) से गतिशील रूप से regexp ऑब्जेक्ट बनाने के लिए एक तरीका खोजने का प्रयास कर रहा हूं और फिर किसी अन्य स्ट्रिंग को फ़िल्टर करने के लिए इसका उपयोग करता हूं। यह उदाहरण गिट प्रतिबद्ध संदेश से डेटा निकालना है, लेकिन सिद्धांत में किसी भी वैध regexp डेटाबेस में स्ट्रिंग के रूप में मौजूद हो सकता है।रूबी

क्या

>> string = "[ALERT] Project: Revision ...123456 committed by Me <[email protected]>\n on 2009- 07-28 21:21:47\n\n Fixed typo\n" 
>> r = Regexp.new("[A-Za-z]+: Revision ...[\w]+ committed by [A-Za-z\s]+") 
>> string[r] 
=> nil 

होता है मैं क्या करने के लिए

>> string = "[ALERT] Project: Revision ...123456 committed by Me <[email protected]>\n on 2009- 07-28 21:21:47\n\n Fixed typo\n" 
>> string[/[A-Za-z]+: Revision ...[\w]+ committed by [A-Za-z\s]+/] 
=> "Project: Revision 123456 committed by Me" 

उत्तर

11

आप केवल एक ही बात याद आ रही रहे हैं:

>> Regexp.new "\w" 
=> /w/ 
>> Regexp.new "\\w" 
=> /\w/ 

बैकस्लैश तार में भागने पात्र हैं। यदि आप एक शाब्दिक बैकस्लैश चाहते हैं तो आपको इसे दोगुना करना होगा।

>> string = "[ALERT] Project: Revision ...123456 committed by Me <[email protected]>\n on 2009- 07-28 21:21:47\n\n Fixed typo\n" 
=> "[ALERT] Project: Revision ...123456 committed by Me <[email protected]>\n on 2009- 07-28 21:21:47\n\n Fixed typo\n" 
>> r = Regexp.new("[A-Za-z]+: Revision ...[\\w]+ committed by [A-Za-z\\s]+") 
=> /[A-Za-z]+: Revision ...[\w]+ committed by [A-Za-z\s]+/ 
>> string[r] 
=> "Project: Revision ...123456 committed by Me " 

आमतौर पर, अगर आप अपने "टूटे" लाइनों के बजाय सिर्फ इनपुट से उत्पादन चिपकाया था, तो आप शायद देखा है चाहते हैं कि w और s बच गए नहीं थे ठीक से

+0

बिल्कुल सही, धन्यवाद - मुझे पता था कि मैं कुछ आसानी से गलत कर किया जाना था। – davidsmalley

0

विकल्प 1:

# Escape the slashes: 
r = Regexp.new("[A-Za-z]+: Revision ...[\\w]+ committed by [A-Za-z\\s]+") 

नुकसान: मैन्युअल रूप से सभी ज्ञात भागने वर्ण से बचें

विकल्प 2:

# Use slashes in constructor 
r = Regexp.new(/[A-Za-z]+: Revision ...[\w]+ committed by [A-Za-z\s]+/) 

नुकसान: कोई नहीं

+0

विकल्प 2 के लिए - कन्स्ट्रक्टर के लिए तर्क हमेशा स्ट्रिंग होता है क्योंकि रेगेक्स डेटाबेस से खींचा जा रहा है ताकि यह इस परिदृश्य में काम न करे। – davidsmalley