Ruby模式匹配除了最后

时间:2012-07-25 18:01:20

标签: ruby replace

我想创建一个Ruby模式来替换除最后一个字母之外的所有字符。

例如,替换所有:

"}" 

字符串:

"} something "

转动此字符串:

"{ anything }   { anything } { anything }"

为:

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

编辑:

到目前为止我用过的东西:

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

但我认为它不是很有效。

2 个答案:

答案 0 :(得分:2)

你可以使用积极的前瞻:

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

=> "{ anything } Something   { anything } Something { anything }"

答案 1 :(得分: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"