5

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

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

1 回答 1

9

逃进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'成为文字字符串\dtr引擎反过来使用文字字符串中的反斜杠来转义d. 结果:用 xtr替换实例。d

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

定义为的字符串'\\\d'成为文字\\d。首先\\成为\. 然后\d变为\d,即保留反斜杠。(这种特殊行为不同于双字符串,其中反斜杠会被活着吃掉,只留下一个 lonsome d

\\d然后,文字字符串用替换字符串tr替换所有反斜杠或 ad字符。

于 2011-05-08T09:30:01.003 回答