2011-11-15 67 views
8

我想在Ruby中做一個簡單的字符串子。紅寶石字符串sub沒有正則表達式返回引用

sub()的第二個參數是一小段含有正則表達式的縮小的JavaScript。在此字符串中的正則表達式中的反向引用似乎影響了sub的結果,因爲被替換的字符串(即第一個參數)出現在輸出字符串中。

實施例:

input = "string <!--tooreplace--> is here" 
output = input.sub("<!--tooreplace-->", "\&") 

我想要的輸出爲:

"string \& is here" 

加:

"string & is here" 

,或者如果逸出該正則表達式

"string <!--tooreplace--> is here" 

基本上,我想要一些做字符串sub的方法,根本沒有正則表達式的後果 - 只是一個簡單的字符串替換。

+0

你可以創建一個小例子來演示這個問題嗎? –

+0

添加示例代碼。 –

回答

2

使用單引號和轉義反斜線:

output = input.sub("<!--tooreplace-->", '\\\&') #=> "string \\& is here" 
6

爲了避免弄清楚如何逃脫替換字符串,用Regex.escape。更換複雜時很方便,或者處理它是一種不必要的痛苦。 String上的一個小幫手也不錯。

input.sub("<!--toreplace-->", Regexp.escape('\&')) 
+2

修復了這個例子,但它似乎在其他地方引發了問題。例如,如果將第二個參數更改爲'\&,O =/\ s *([\ s \ + \〜>])\ s */g',則輸出看起來像'string \&,O =/\ s \ * \(\ [\ s \\〜> \] \)\ s \ */g在這裏'帶有多餘的額外事物。 –

3

您還可以使用塊符號,使其更簡單(相對於Regexp.escape):

=> puts input.sub("<!--tooreplace-->") {'\&'} 
string \& is here 
+0

令人難以置信的幫助 - 特別是因爲它適用於其他用途(例如,讀取文件並使用文件內容作爲替換字符串),其中轉義根本就不是一種選擇。 –

0

好吧,既然'\\&'(即\其次&)被解釋爲一個特殊的正則表達式聲明,它有理由說你需要避開反斜槓。事實上,這個工程:

>> puts 'abc'.sub 'b', '\\\\&' 
a\&c 

注意\\\\&表示文字串\\&