对我来说,单引号字符串文字作为String#tr
参数时反斜杠的转义状态有些神秘。您能解释下面三个示例之间的对比吗?我特别不理解第二个示例。为避免复杂化,在此处使用'd'
,在双引号中转义时不改变含义("\d"
= "d"
)。
'\\'.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
将d
的实例替换为x。
'\\'.tr('\\\d', 'x') #=> "x"
'\\\d'
的字符串变成了字面量\\d
。 首先,\\
变成\
。 然后\d
保持不变,即反斜杠被保留。 (这种特殊行为与双引号字符串不同,其中反斜杠将被消耗,只留下一个孤独的d
)\\d
使tr
将所有反斜杠或d
字符替换为替换字符串。
'\\rs'.tr('\\rs','x')
的返回值是\\xx
!? 我本来期望的返回值是xxx
。在文档示例中,当to_str
比from_str
短时,*
比aeiou
更短,那么 如果to_str
比from_str
短,则使用其最后一个字符进行填充 是什么意思?这是一个 bug 吗?是一只苍蝇吗?是超人吗?:D - Zabba"hello".tr('aeiou', '*#')
和"hello".tr('aeiou', '*####')
是一样的。 :D - sawa'\\d'.tr('\\d','xx)
?我不期望它所给出的结果.. - Zabba