2012-04-20 75 views
2

我有內容的簡單的文本文件:紅寶石雙斜線GSUB問題

patent-inv 

我要去取代專利-INV第1部分第2部分\\

我做到了在這樣的方式:

source_file = IO.read("#{Rails.root}/my_userdata/1.txt") 
source_file.gsub!('<<<patent-inv>>>', "part1\\\\part2")    
File.open("#{Rails.root}/my_userdata/2.txt", "wb") {|f| f.write source_file } 

但在文件中我得到:第一部分 \ 2部分

我嘗試了幾種方法,但我得到了相同的結果:

source_file.gsub!('<<<patent-inv>>>', "part1\\\\part2") => "part1\part2" 
source_file.gsub!('<<<patent-inv>>>', "part1\\\part2") => "part1\part2" 
source_file.gsub!('<<<patent-inv>>>', "part1\\part2") => "part1\part2" 

誰能幫我找到了這種奇怪的行爲?

+1

**爲馬茨說:**反斜槓在字符串中的特殊含義逃跑,所以你需要 雙斜槓。另外,反斜槓在 gsub/sub替換字符串中有特殊含義,所以你需要再次翻倍。那是 之所以你需要4個反斜槓來代替 替換中的每個單個反斜槓。這很奇怪,但很長一段時間它是規格。我不認爲 我們可以改變這種行爲。您可以改爲使用block,例如** printf「b」.gsub(/ b /){'\\'} ** – 2012-04-20 08:30:08

回答

3

以下適用於我。你在碼頭試過了嗎?當您輸出結果時,它可能會轉義。

> a = "<<<patent-inv>>>" 
> a.gsub("<<<patent-inv>>>", "part1\\\\part2")  
=> "part1\\part2" 

你可以看到輸出會如何變化putsp編輯之間

> puts a 
part1\part2 
> p a 
"part1\\part2" 
> puts a.inspect 
"part1\\part2" 

這裏是因爲你想要顯示的輸出。

1.9.2-p290 :037 > a.gsub!("<<<patent-inv>>>", "part1\\\\\\part2") 
=> "part1\\\\part2" 
> p a 
"part1\\\\part2" 
=> "part1\\\\part2" 
> puts a 
part1\\part2 
=> nil 

我們知道當改變時4個反斜槓等於2個未反轉的反斜槓。因此需要在替換後正確顯示4個反斜槓。

+0

是的,在控制檯中它工作。但爲什麼它的工作? ** source_file.gsub!('patent-inv',「part1 \\ part2」)=>「part1 \\ part2」**。但爲什麼?? – 2012-04-20 07:40:33

+0

因爲輸出時「\\」未轉義爲「\」。查看我的編輯。 – Gazler 2012-04-20 07:41:28

+0

好的,這對我來說很明顯。但我的問題是關於寫入文件。爲什麼會有意外的行爲? – 2012-04-20 07:57:19

2

編輯糾正我的答案作爲一個整體。我誤導了puts在輸出時跳過了\這個符號,因此我認爲我沒有真正在那裏達到目標。但現在我有它的工作。見我的實驗:

> str = "patent-inv" 
=> "patent-inv" 
> str.gsub!('patent-inv', "part1\\\\part2") 
=> "part1\\part2" 
> str.chars.each { |t| puts t } 
p 
a 
r 
t 
1 
\ 
p 
a 
r 
t 
2 
=> "part1\\part2" 
> str = "patent-inv" 
=> "patent-inv" 
> str.gsub!('patent-inv', "part1\\\\\\part2") 
=> "part1\\\\part2" 
> str.chars.each { |t| puts t } 
p 
a 
r 
t 
1 
\ 
\ 
p 
a 
r 
t 
2 
=> "part1\\\\part2" 

基本上我用str.chars.each { |t| puts t },看看有什麼字符實際上包含的字符串中。正如你所看到的使用正確的模式是part1\\\\\\part2

+0

在控制檯中它的工作原理和它不能同時工作:** source_file.gsub!('patent-inv',「part1 \\ part2」)**給了我相同的結果**「part1 \\ part2 「**。但爲什麼?? – 2012-04-20 07:38:55

+0

我改正了我的答案,因爲這是完全錯誤的。我誤導了輸出。實際上這個字符串只包含一個'\',但是放棄了它,它看起來是雙倍的。 – 2012-04-20 08:12:00

1

嘗試

source_file.gsub!('<<<patent-inv>>>', "part1\\\\\\\\part2") => "part1\part2" 

=)

+0

也許source_file.gsub!('<< >>',「part1 \\\\\\\\\\\\\ part2」)=>「part1 \ part2」??? )) – 2012-04-20 07:57:43

+0

實際上,我測試了我的代碼:從文件讀取並寫入另一個。當你把gsub \\\\\\翻譯成\\\\,當你寫\\\\翻譯成\\ – gayavat 2012-04-20 08:07:06

+0

好的,謝謝你的建議 – 2012-04-20 08:09:26