2011-11-15 8 views
8

मैं रुबी में एक साधारण स्ट्रिंग सब करने की कोशिश कर रहा हूं।रूबी स्ट्रिंग सब बिना रेगेक्स बैक रेफरेंस

उप() के लिए दूसरा तर्क minified जावास्क्रिप्ट का एक लंबा टुकड़ा है जिसमें नियमित अभिव्यक्तियां होती हैं। इस स्ट्रिंग में रेगेक्स में बैक संदर्भ उप के परिणाम को प्रभावित कर रहे हैं, क्योंकि प्रतिस्थापित स्ट्रिंग (यानी, पहला तर्क) आउटपुट स्ट्रिंग में दिखाई दे रहा है।

उदाहरण:

input = "string <!--tooreplace--> is here" 
output = input.sub("<!--tooreplace-->", "\&") 

मैं उत्पादन होना चाहते हैं:

"string \& is here" 
नहीं

:

"string & is here" 

या यदि regex

"string <!--tooreplace--> is here" 
बचने

असल में, मैं एक स्ट्रिंग उप करने का कोई तरीका चाहता हूं जिसमें कोई रेगेक्स नतीजे न हो - बस एक साधारण स्ट्रिंग को प्रतिस्थापित करें।

+0

क्या आप एक छोटा सा उदाहरण बना सकते हैं जो इस मुद्दे को प्रदर्शित करता है? –

+0

उदाहरण कोड जोड़ा गया। –

उत्तर

2

उपयोग एकल उद्धरण और बैकस्लैश से बचने:

output = input.sub("<!--tooreplace-->", '\\\&') #=> "string \\& is here" 
6

यह पता लगाने प्रतिस्थापन स्ट्रिंग से बचने के लिए कैसे, Regex.escape उपयोग करने के लिए होने से बचने के लिए। यह आसान है जब प्रतिस्थापन जटिल होते हैं, या इससे निपटना एक अनावश्यक दर्द है। स्ट्रिंग पर थोड़ा सा सहायक भी अच्छा है।

input.sub("<!--toreplace-->", Regexp.escape('\&')) 
+2

यह उदाहरण को हल करता है, लेकिन ऐसा लगता है कि यह कहीं और समस्याएं पैदा करता है। उदाहरण के लिए, यदि आप दूसरे तर्क को '\ &, O =/\ s * ([\ s \ + \ ~>]) \ s */g' में बदलते हैं तो आउटपुट 'स्ट्रिंग \ &, O =/\ एस \ * \ (\ [\ s \\ ~> \] \) \ s \ */g यहां है 'अतिरिक्त चीजों के भार से बच निकला। –

3

तुम भी ब्लॉक संकेतन का उपयोग कर सकते हैं यह आसान है (जैसा कि Regexp.escape के खिलाफ) बनाने के लिए:

=> puts input.sub("<!--tooreplace-->") {'\&'} 
string \& is here 
+0

अविश्वसनीय रूप से सहायक - विशेष रूप से यह अन्य उपयोगों पर लागू होता है (उदाहरण के लिए, एक फ़ाइल पढ़ना और प्रतिस्थापन के लिए स्ट्रिंग के रूप में फ़ाइल सामग्री का उपयोग करना) जिसमें भागना बस एक विकल्प नहीं है। –

0

खैर (अर्थात, \& द्वारा पीछा किया है) के रूप में व्याख्या की जा रही है, के बाद से '\\&' एक विशेष रेगेक्स स्टेटमेंट, इसका कारण यह है कि आपको बैकस्लैश से बचने की आवश्यकता है। वास्तव में, यह काम करता है:

>> puts 'abc'.sub 'b', '\\\\&' 
a\&c 

ध्यान दें कि \\\\& शाब्दिक स्ट्रिंग \\& प्रतिनिधित्व करता है।

संबंधित मुद्दे