2012-07-25 123 views
0

我想創建一個Ruby模式來替換除了最後一個字母以外的所有字符。Ruby模式完全匹配

例如,更換所有:

"}" 

以字符串:

"} something " 

打開這個字符串:

"{ anything } { anything } { anything }" 

到:

"{ anything } something { anything } something { anything }" 

編輯:

我到目前爲止已經使用:

replaceString = "} something" 
string.gsub("}", replaceString).reverse.sub(replaceString.reverse, "}").reverse 

,但我不認爲這是非常有效的。

+1

我們建議您[研究您的問題(http://stackoverflow.com/questions/how-to-ask)。如果你[已經嘗試過](http://whathaveyoutried.com/),請將其添加到問題中,如果不是,先研究並嘗試你的問題,然後再回來。 – 2012-07-25 18:04:36

回答

2

您可以使用正前瞻:

str = "{ anything } { anything } { anything }" 
pattern = /\}(?=.*\})/ 
str.gsub(pattern, "} Something") 

=> "{ anything } Something { anything } Something { anything }" 
+0

只適用於一行,如果字符串中有任何'\ n'它不起作用 – Jonas 2012-07-25 18:46:43

+0

對於多行使用'pattern = /\}(?=.*\})/ m' – Yossi 2012-07-25 18:58:39

+0

謝謝,它工作完美:) – Jonas 2012-07-25 19:39:02

2

在我的其他答案,我沒告訴你,正則表達式是這樣一個簡單的問題矯枉過正,更何況它可能是最慢的可能的解決方案。

我寧願這樣一個簡單的定製解決方案:

def replace_all_but_last str, substr1, substr2 
    str.dup.tap { |result| 
    index = str.rindex substr1 
    result[0...index] = result[0...index].gsub(substr1, substr2) 
    } 
end 

str = "{ anything } { anything } { anything }" 
replace_all_but_last str, "}", "} something"