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