2010-05-06 9 views
5

मैं अपने जीवन के लिए यह नहीं समझ सकता, भले ही यह बहुत आसान हो।रूबी - एस्केप पेरेंटेसिस

मैं कैसे "\(" और "\)" साथ एक स्ट्रिंग पर "(" और ")" की सभी घटनाओं की जगह ले सकता है?

"foo (bar) foo".gsub("(", "\(") # => "foo (bar) foo" 

"foo (bar) foo".gsub("(", "\\(") # => "foo \\(bar) foo" 

किसी भी विचार:

कुछ भी नहीं काम करने के लिए लगता है?

उत्तर

4

देखेंगे आप पहले से ही है आपके दूसरे प्रयास के साथ समाधान, आप केवल भ्रमित थे क्योंकि स्ट्रिंग इंटरैक्टिव दुभाषिया में भागने वाले रूप में प्रदर्शित होती है। लेकिन वास्तव में केवल दो बैकस्लैश नहीं हैं। पुट का उपयोग कर इसे मुद्रण की कोशिश करो और आप केवल एक बैकस्लैश वास्तव में है कि वहाँ देखेंगे:

> "foo (bar) foo".length 
=> 15 
> "foo (bar) foo".gsub("(", "\\(").length 
=> 16 

यदि यह जोड़ा था:

> "foo (bar) foo".gsub("(", "\\(") 
=> "foo \\(bar) foo" 
> puts "foo (bar) foo".gsub("(", "\\(") 
foo \(bar) foo 

आप आगे समझाने की जरूरत है, स्ट्रिंग की लंबाई को आज़माने का प्रयास दो बैकस्लैश यह 17 प्रिंट नहीं 16.

+0

बहुत बहुत धन्यवाद! –

0

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

1

"foo (bar) foo".gsub("(", "\\\\(") काम करता है। आप कंसोल में यह कोशिश कर रहे हैं, तो आप शायद \\( स्ट्रिंग देख रहे हैं क्योंकि कंसोल का निरीक्षण के साथ स्ट्रिंग, कि \

निकल जाता है के साथ प्रयास करें आउटपुट: puts "foo (bar) foo".gsub("(", "\\(") और आप

3

यहाँ क्या मैं सिर्फ एक कॉल में दोनों कोष्ठक को बदलने के लिए प्रयोग किया है:

str.gsub(/(\(|\))/,'\\\\\1') 
संबंधित मुद्दे