作爲String#tr
的參數,單引號字符串文字中反斜槓的轉義狀態有些神祕。你能解釋下面三個例子的對比嗎?我特別不明白第二個。爲了避免出現複雜情況,我在這裏使用了'd'
,這在雙引號轉義時不會改變含義("\d"
= "d"
)。作爲`String#tr`的參數在字符串文字中的轉義狀態
'\\'.tr('\\', 'x') #=> "x"
'\\'.tr('\\d', 'x') #=> "\\"
'\\'.tr('\\\d', 'x') #=> "x"
作爲String#tr
的參數,單引號字符串文字中反斜槓的轉義狀態有些神祕。你能解釋下面三個例子的對比嗎?我特別不明白第二個。爲了避免出現複雜情況,我在這裏使用了'd'
,這在雙引號轉義時不會改變含義("\d"
= "d"
)。作爲`String#tr`的參數在字符串文字中的轉義狀態
'\\'.tr('\\', 'x') #=> "x"
'\\'.tr('\\d', 'x') #=> "\\"
'\\'.tr('\\\d', 'x') #=> "x"
tr
的tr
的第一個參數的工作逃逸很像括號字符在正則表達式分組。您可以在表達式的開頭使用^
來否定匹配(替換任何不匹配的內容)並使用例如a-f
以匹配一系列字符。既然它有控制字符,它也會在內部轉義,所以你可以使用-
和^
作爲文字字符。
print 'abcdef'.tr('b-e', 'x') # axxxxf
print 'abcdef'.tr('b\-e', 'x') # axcdxf
逃離此外,使用單引號時,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'
的字符串成爲文字串\d
。 tr
引擎反過來使用文字字符串中的反斜槓來轉義d
。結果:tr
用x替換d
的實例。
'\\'.tr('\\\d', 'x') #=> "x"
定義爲'\\\d'
的字符串成爲字面\\d
。首先\\
變成\
。然後\d
變成\d
,即保留反斜線。 (這種特殊的行爲與雙串,其中反斜線會被活活吃掉不同,只留下了一個寂寞d
)
文本字符串\\d
然後進行tr
替換或者是一個反斜槓或替換字符串d
所有字符。
感謝您的解釋。尼斯。 – sawa 2011-05-08 09:42:57
有趣。爲什麼''\\ 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
@Zabba它意味着''hello「.tr('aeiou','*#')'和'你好'是一樣的。tr('aeiou','* ####')'。 :D – sawa 2011-05-08 09:27:31
從''\\ d'.tr('\\ d','xx)'?你會期望什麼輸出(請不要執行它,請!)!我不指望它*會做什麼*給.. – Zabba 2011-05-08 09:30:54