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解释它的方式,因此有人可以解释这是怎么回事吗?
我该怎么做才能得到上面想要的替代品?
使用单引号而不是双引号时,转义是有限的:
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)