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

时间:2010-06-12 11:48:07

标签: ruby regex replace escaping backreference

请考虑以下代码段:

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

打印(as seen on ideone.com):

hello hello \0 \0

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

hello \0 \hello \\0

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

我需要做些什么来获得我想要的替代品?

1 个答案:

答案 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"