2011-05-08 16 views
5

वहाँ एक भी उद्धृत स्ट्रिंग String#tr के तर्क के रूप में शाब्दिक भीतर एक बैकस्लैश के भागने स्थिति के बारे में कुछ मेरे लिए रहस्यमय है। क्या आप नीचे दिए गए तीन उदाहरणों के बीच के अंतर को समझा सकते हैं? मैं विशेष रूप से दूसरे को समझ नहीं पा रहा हूं। जटिलता से बचने के लिए, मैं यहां 'd' का उपयोग कर रहा हूं, जो डबल कोटेशन ("\d" = "d") से बचने के अर्थ को नहीं बदलता है।भागने स्थिति tr`

'\\'.tr('\\', 'x')  #=> "x" 
'\\'.tr('\\d', 'x')  #=> "\\" 
'\\'.tr('\\\d', 'x') #=> "x" 
+0

दिलचस्प। और क्यों '' \\ rs'.tr ('\\ आरएस', 'एक्स') 'वापसी' \\ xx' ?! मुझे 'xxx' का रिटर्न वैल्यू अपेक्षित होता। और [दस्तावेज़ीकरण उदाहरण] में (http://ruby-doc.org/core/classes/String.html#M001199) '"हैलो" .tr (' aeiou ',' * ') ',' * 'छोटा है 'aeiou' से, तो क्या होता है * यदि to_str से_strstr से छोटा है, तो यह अपने अंतिम चरित्र * माध्य के साथ गद्देदार है? क्या यह एक बग है? क्या यह एक फ्लाई है? क्या यह सुपरमैन है? : डी – Zabba

+0

@ ज़ब्बा इसका मतलब है कि "हैलो" .tr ('aeiou', '* #') '' हैलो 'जैसा ही है।tr ('aeiou', '* ####') '। : डी – sawa

+0

'' \\ d'.tr ('\\ d', 'xx)' से, आप किस आउटपुट की अपेक्षा करेंगे (अभी तक इसे निष्पादित न करें, कृपया!)? मुझे उम्मीद नहीं है कि यह * क्या करता है .. – Zabba

उत्तर

9

ज्यादा ब्रैकेट चरित्र नियमित अभिव्यक्ति में समूहीकरण की तरह tr

tr का पहला तर्क काम करता है में पलायन। आप मिलान को अस्वीकार करने के लिए अभिव्यक्ति की शुरुआत में ^ का उपयोग कर सकते हैं (जो कुछ भी मेल नहीं खाता है) और उदाहरण का उपयोग करें वर्णों की एक श्रृंखला से मेल खाने के लिए a-f। चूंकि इसमें नियंत्रण वर्ण हैं, यह आंतरिक रूप से भाग रहा है, इसलिए आप शाब्दिक पात्रों के रूप में - और ^ का उपयोग कर सकते हैं।

print 'abcdef'.tr('b-e', 'x') # axxxxf 
print 'abcdef'.tr('b\-e', 'x') # axcdxf 

रूबी एकल उद्धरण तार

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

# Single quotes 
print '\\' # \ 
print '\d' # \d 
print '\\d' # \d 
print '\\\d' # \\d 

# Double quotes 
print "\\" # \ 
print "\d" # d 
print "\\d" # \d 
print "\\\d" # \d 

उदाहरण को ध्यान में

पर दोबारा गौर किया कि सभी के साथ, फिर से उदाहरण को देखो।

'\\'.tr('\\', 'x')  #=> "x" 

स्ट्रिंग '\\' के रूप में परिभाषित शाब्दिक स्ट्रिंग \ क्योंकि पहले बैकस्लैश दूसरा निकल जाता हो जाता है। वहां कोई आश्चर्य नहीं है।

'\\'.tr('\\d', 'x')  #=> "\\" 

स्ट्रिंग '\\d' के रूप में परिभाषित शाब्दिक स्ट्रिंग \d हो जाता है। tr इंजन, बदले में d से बचने के लिए शाब्दिक स्ट्रिंग में बैकस्लैश का उपयोग करता है। परिणाम: tr एक्स के साथ d के उदाहरणों को प्रतिस्थापित करता है।

'\\'.tr('\\\d', 'x') #=> "x" 

स्ट्रिंग '\\\d' के रूप में परिभाषित शाब्दिक \\d हो जाता है। पहले \\\ बन जाता है। फिर \d\d बन जाता है, यानी बैकस्लैश संरक्षित है। (यह विशेष रूप से व्यवहार डबल तार, जहां बैकस्लैश जिंदा खाया किया जाएगा से अलग है, केवल एक एकाकी d छोड़कर)

शाब्दिक स्ट्रिंग \\d तो tr बनाता है सभी पात्रों है कि या तो एक बैकस्लैश या बदलने तार के साथ एक d हैं की जगह ।

+1

धन्यवाद। अच्छा लगा। – sawa

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