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