2011-05-08 53 views
5

作爲String#tr的參數,單引號字符串文字中反斜槓的轉義狀態有些神祕。你能解釋下面三個例子的對比嗎?我特別不明白第二個。爲了避免出現複雜情況,我在這裏使用了'd',這在雙引號轉義時不會改變含義("\d" = "d")。作爲`String#tr`的參數在字符串文字中的轉義狀態

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

有趣。爲什麼''\\ rs'.tr('\\ rs','x')'返回'\\ xx' ?!我會期望返回值爲'xxx'。在[documentation example](http://ruby-doc.org/core/classes/String.html#M001199)'「hello」.tr('aeiou','*')','*'更短如果to_str比from_str短,則用最後一個字符填充* 是什麼意思?這是一個錯誤嗎?它是蒼蠅嗎?它是超人嗎? :D – Zabba 2011-05-08 09:26:01

+0

@Zabba它意味着''hello「.tr('aeiou','*#')'和'你好'是一樣的。tr('aeiou','* ####')'。 :D – sawa 2011-05-08 09:27:31

+0

從''\\ d'.tr('\\ d','xx)'?你會期望什麼輸出(請不要執行它,請!)!我不指望它*會做什麼*給.. – Zabba 2011-05-08 09:30:54

回答

9

tr

tr的第一個參數的工作逃逸很像括號字符在正則表達式分組。您可以在表達式的開頭使用^來否定匹配(替換任何不匹配的內容)並使用例如a-f以匹配一系列字符。既然它有控制字符,它也會在內部轉義,所以你可以使用-^作爲文字字符。

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

Ruby的單引號字符串

逃離此外,使用單引號時,Ruby的嘗試可能時包括反斜線,即當它不能用於實際逃脫一個反斜槓或單引號。

# 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'的字符串成爲文字串\dtr引擎反過來使用文字字符串中的反斜槓來轉義d。結果:tr用x替換d的實例。

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

定義爲'\\\d'的字符串成爲字面\\d。首先\\變成\。然後\d變成\d,即保留反斜線。 (這種特殊的行爲與雙串,其中反斜線會被活活吃掉不同,只留下了一個寂寞d

文本字符串\\d然後進行tr替換或者是一個反斜槓或替換字符串d所有字符。

+1

感謝您的解釋。尼斯。 – sawa 2011-05-08 09:42:57

相關問題