2010-06-12 31 views
4

考慮下面的代碼片段:在反斜線GSUB(逃逸,逆向引用)

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

此打印(as seen on ideone.com):

hello hello \0 \0 

這是非常令人驚訝的,因爲我希望看到類似的東西這個代替:

hello \0 \hello \\0 

我的論點是,\是一個轉義字符,所以你寫\\得到一個文字反斜槓,因此\\0是一個文字反斜槓\其次是0,等等。顯然這不是如何gsub解釋它,所以有人可以解釋發生了什麼?

我需要做些什麼來獲得我想要的替換?

回答

4

逃逸是有限的使用單引號而不是雙引號時:

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

"\0"是空字符(在C即用於確定字符串的末尾),其中作爲'\0'"\\0",因此'hello'.gsub(/.+/, '\0')'hello'.gsub(/.+/, "\\0")返回"hello",但'hello'.gsub(/.+/, "\0")返回"\000"。現在'hello'.gsub(/.+/, '\\0')返回'hello'是紅寶石試圖處理程序員不記住單引號和雙引號之間的區別。實際上,這與gsub'\0' == "\\0"'\\0' == "\\0"無關。遵循這個邏輯,無論你怎麼想,它都是紅寶石看到其他字符串的方式:'\\\0''\\\\0'等於"\\\\0",這(打印時)給你\\0。由於gsub使用\x來插入匹配號碼x,因此您需要一種方法來轉義\x,即\\x或其字符串表示形式:"\\\\x"

因此行

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

確實導致

hello \0 \hello \\0 
+0

+1,沒錯。它與'gsub'完全無關。 'puts'\ 0 \\ 0 \\\ 0 \\\\ 0''打印'\ 0 \ 0 \\ 0 \\ 0'(http://ideone.com/3sPxD) – polygenelubricants 2010-06-13 09:56:57