逃亡于tr
第一个参数tr
其工作原理与正则表达式中的括号字符分组非常相似。您可以使用^
在表达式的开头否定匹配(替换任何不匹配的内容)并使用例如a-f
匹配一系列字符。由于它有控制字符,它也会在内部进行转义,所以你可以使用-
and ^
作为文字字符。
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'
变成文字字符串\d
. The tr
引擎又使用文字字符串中的反斜杠来转义d
。结果:tr
替换实例d
with x.
'\\'.tr('\\\d', 'x') #=> "x"
字符串定义为'\\\d'
变成字面意思\\d
. First \\
变成\
. Then \d
变成\d
,即保留反斜杠。 (这种特殊的行为与双字符串不同,双字符串中的反斜杠会被活活吃掉,只留下一个孤独的字符串d
)
文字字符串\\d
然后使tr
替换所有反斜杠或d
与替换字符串。