gsub中的反斜杠(转义和反向引用)

pol*_*nts 4 ruby regex backreference replace escaping

考虑以下代码段:

puts 'hello'.gsub(/.+/, '\0 \\0 \\\0 \\\\0')
Run Code Online (Sandbox Code Playgroud)

打印结果(如ideone.com所示):

hello hello \0 \0
Run Code Online (Sandbox Code Playgroud)

这非常令人惊讶,因为我希望看到这样的东西:

hello \0 \hello \\0
Run Code Online (Sandbox Code Playgroud)

我的观点是,这\是一个转义字符,因此您编写\\以获得一个文字反斜杠,因此\\0是一个文字反斜杠,\后跟0,等等。显然,这不是gsub解释它的方式,因此有人可以解释这是怎么回事吗?

我该怎么做才能得到上面想要的替代品?

Kon*_*ase 5

使用单引号而不是双引号时,转义是有限的:

puts 'sinlge\nquote'
puts "double\nquote"
Run Code Online (Sandbox Code Playgroud)

"\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看到其他字符串的方式:both '\\\0''\\\\0'equal "\\\\0",(在打印时)给您\\0。gsub \x用于插入匹配编号x时,您需要一种转义方式\x,即\\x,或以其字符串表示形式:"\\\\x"

因此线

puts 'hello'.gsub(/.+/, "\\0 \\\\0 \\\\\\0 \\\\\\\\0")
Run Code Online (Sandbox Code Playgroud)

确实导致

hello \0 \hello \\0
Run Code Online (Sandbox Code Playgroud)