2012-06-18 68 views
3

gsub有一些替代方法,只是將一個字符串替換替換爲另一個替代字符串?如何逃避gsub替換字符串中的反向引用

根據文檔「如果replacement是一個字符串,它會替換匹配的文本,它可能包含對\ d格式的捕獲組的反引用,其中d是組編號或\ k,其中n是一個組名。「

我不想要這個功能..

簡單的例子:

"abc".gsub("b", "\\7") -> "ac" 

,我想"a\7c" ..

的問題是,替換字符串從用戶問(實際上它是一個包含"xxx\7.0\yyy"的路徑),如果它是簡單的固定字符串,我可以自己逃脫它。

我知道這個作品:"abc".gsub("b") { |x| "\\\7" } ..但作爲紅寶石這樣一個beatifull語言來學習到現在我相信應該有一個簡單的替代我在文檔中忽略。

+0

不知道如果這就是你以後在做什麼(如果是,我可以張貼這是答案):'s ='abc'; s ['b'] ='\ 7.0'; s'。 – polarblau

+0

這將取代第一次發生,與子..但我需要gsub(全部替換)。 –

回答

1
$ irb 
irb(main):001:0> replace='xxx\7.0\yyy' 
=> "xxx\\7.0\\yyy" 
irb(main):002:0> puts "abc".gsub("b", replace.dump[1..-2]) 
axxx\7.0\yyyc 
=> nil 
+0

這是有效的..但[1 ..- 2]看起來很神祕..塊表示法更清晰。這是第一次紅寶石令我驚喜! –

6

您可以使用編輯:不,你不能)Regexp.escape逃避用戶提供的字符串:

user_input = '\7' 
puts "abc".gsub("b", Regexp.escape(user_input)) 
a\7c 

使用單引號代替雙否則轉義:

puts "abc".gsub("b", '\\\7') 
a\7c 

...或用雙引號,你只需要更多的轉義:

puts "abc".gsub("b", "\\\\7") 
a\7c 

...或塊符號,但你可以跳過塊變量就好了:

puts "abc".gsub("b") { '\7' } 
a\7c 
+0

這是行不通的: puts「abc」.gsub(「b」,Regexp.escape('\ 7.0'))>> a \ 7 \ .0c 還有另一個反斜槓添加我不知道爲什麼。 –

+0

@pragmatic_programmer - 你說得對。我的錯。在這個例子中你不能使用'Regexp.escape'。它不會工作。因此,對於你的情況,它只留下最後一個選項(塊表示法)或qdiesel的答案。 – Casper

+0

@pragmatic_programmer - 還有一個選擇是用另一個gsub逃脫逃跑,但是看起來很醜陋。所以你應該這樣做:'gsub(「b」,user_input.gsub('\\','\\\\\'))''。 – Casper

相關問題