5

考虑以下代码段:

puts 'hello'.gsub(/.+/, '\0 \\0 \\\0 \\\\0')

这打印(如在 ideone.com 上看到的):

hello hello \0 \0

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

hello \0 \hello \\0

我的论点是这\是一个转义字符,所以你写\\得到一个文字反斜杠,因此\\0是一个文字反斜杠\0等等。显然这不是gsub解释它的方式,所以有人可以解释发生了什么吗?

我该怎么做才能得到我想要的替换?

4

1 回答 1

7

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

puts 'sinlge\nquote'
puts "double\nquote"

"\0"是空字符(即在 C 中用于确定字符串的结尾),其中 as'\0'"\\0",因此两者都是'hello'.gsub(/.+/, '\0')'hello'.gsub(/.+/, "\\0")return "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")

确实导致

hello \0 \hello \\0
于 2010-06-12T13:21:11.110 回答