2012-07-25 2 views
0

편지의 마지막 발생을 제외한 모두를 대체하기 위해 루비 패턴을 만들고 싶습니다.루비 패턴이 모두 마지막으로 일치합니다.

예를 들어, 모든 대체 :

"} 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/)이 있으면 질문에 추가하십시오. 아니라면 질문을 먼저 연구하고 시도한 다음 다시 방문하십시오. –

답변

2

당신은 긍정적 예측 사용할 수 있습니다 : 그 정규식 당신에게하지 않았다 내 다른 대답에

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

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

문자열에 '\ n'이있는 경우 한 줄만 작동합니다. – Jonas

+0

여러 줄 사용의 경우 'pattern = /\}(?=.*\})/ m' – Yossi

+0

고마워요, 완벽하게 작동했습니다. :) – Jonas

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" 
관련 문제