gsub中的反斜杠(转义和反向引用)
请考虑以下代码段:
puts 'hello'.gsub(/.+/, '\0 \\0 \\\0 \\\\0')
这打印( 如ideone.com上所示 ):
hello hello \0 \0
这是非常令人惊讶的,因为我希望看到类似的东西:
hello \0 \hello \\0
我的论点是\
是一个转义字符,所以你写\\
得到一个字面反斜杠,因此\\0
是一个字面反斜杠\
后跟0
,等等。显然这不是gsub
如何解释它,所以有人可以解释这是怎么回事?
我需要做些什么来获得我想要的替代品呢?
使用单引号而不是双引号时,转义是有限的:
puts 'sinlge\nquote' puts "double\nquote"
"\0"
是空字符(在C中用于确定字符串的结尾),其中'\0'
是"\\0"
,因此'hello'.gsub(/.+/, '\0')
和'hello'.gsub(/.+/, "\\0")
返回"hello"
,但'hello'.gsub(/.+/, "\0")
返回"\000"
。 现在'hello'.gsub(/.+/, '\\0')
返回'hello'
是ruby试图处理程序员没有记住单引号和双引号之间的区别。 实际上,这与gsub
无关: '\0' == "\\0"
和'\\0' == "\\0"
。 遵循这个逻辑,不管你怎么想,这就是ruby看到其他字符串的方式: '\\\0'
和'\\\\0'
等于"\\\\0"
,这(打印时)给出你\\0
。 由于gsub使用\x
来插入匹配号x,因此需要一种方法来转义\x
,即\\x
,或者以字符串表示forms: "\\\\x"
。
因此行
puts 'hello'.gsub(/.+/, "\\0 \\\\0 \\\\\\0 \\\\\\\\0")
确实会导致
hello \0 \hello \\0