在作为`String#tr`参数的字符串字面量中转义状态

5

对我来说,单引号字符串文字作为String#tr参数时反斜杠的转义状态有些神秘。您能解释下面三个示例之间的对比吗?我特别不理解第二个示例。为避免复杂化,在此处使用'd',在双引号中转义时不改变含义("\d" = "d")。

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

有趣。为什么 '\\rs'.tr('\\rs','x') 的返回值是 \\xx!? 我本来期望的返回值是 xxx。在文档示例中,当 to_strfrom_str 短时,*aeiou 更短,那么 如果 to_strfrom_str 短,则使用其最后一个字符进行填充 是什么意思?这是一个 bug 吗?是一只苍蝇吗?是超人吗?:D - Zabba
@Zabba 这意味着 "hello".tr('aeiou', '*#')"hello".tr('aeiou', '*####') 是一样的。 :D - sawa
你期望得到什么输出(暂时不要执行它,请!),从'\\d'.tr('\\d','xx)?我不期望它所给出的结果.. - Zabba
@Zabba 我本来期望的是 'xx'。 - sawa
Zabba,显然是语法错误。 ;) - nitro2k01
显示剩余3条评论
1个回答

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。结果:trd的实例替换为x。

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

定义为'\\\d'的字符串变成了字面量\\d。 首先,\\变成\。 然后\d保持不变,即反斜杠被保留。 (这种特殊行为与双引号字符串不同,其中反斜杠将被消耗,只留下一个孤独的d
然后,字面字符串\\d使tr将所有反斜杠或d字符替换为替换字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接