2013-10-17 45 views
3

我不明白爲什麼會這樣:紅寶石:在「\'的存在」串#子莫名其妙的行爲

irb(main):015:0> s = "Hello\\'World" 
=> "Hello\\'World" 
irb(main):016:0> "#X#".sub("X",s) 
=> "#Hello#World#" 

我還以爲輸出將是「#Hello \」世界#「,我當然無法理解多餘的#來自哪裏。

我猜我不熟悉String#sub的內部和「\」符號。

回答

4

這是由於在sub替換字符串中使用了反斜槓。

你替換字符串包含\'其擴展到全局變量$'這是otherwise known asPOSTMATCH。對於字符串替換,它包含匹配文本後面存在的字符串中的所有內容。因此,因爲您替換的X後面跟着#,這就是插入的內容。

比較:

"#X$".sub("X",s) 
=> "#Hello$World$" 

注意,對於sub文檔是指通過\9使用反向引用\0的。這似乎直接指向全局變量$0$9,並且也適用於其他全局變量。

作爲參考,other global variables通過正則表達式匹配設置爲:

$~ is equivalent to ::last_match; 

$& contains the complete matched text; 

$` contains string before match; 

$' contains string after match; 

$1, $2 and so on contain text matching first, second, etc capture group; 

$+ contains last capture group. 
+0

謝謝!我通過「#X#」。sub(「X」){s}解決了這個問題。 –

+0

我不明白髮生了什麼事情..你能告訴我'$''的故事嗎?爲什麼同樣的塊形式沒有發生? –

+0

@ArupRakshit - 查看我答案中的鏈接,但基本上,當您匹配正則表達式時,Ruby會設置一些全局變量。其中之一是'$'' – Gareth