将字符串文字中的状态转义为`String#tr`的参数

时间:2011-05-08 08:43:18

标签: ruby string escaping ruby-1.9 tr

关于单引号字符串文字中反斜杠的转义状态作为String#tr的参数,我有些神秘感。你能解释下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用'd',这不会改变双引号转义时的含义("\d" = "d")。

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

1 个答案:

答案 0 :(得分: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

文字字符串\\d然后使tr替换所有带有替换字符串的反斜杠或d字符。