2016-05-16 18 views
-1

this oneと同様の質問です。つまり、部分文字列の開始インデックスと終了インデックスを指定して別の文字列に置き換えますが、インデックスを使用していくつかの部分文字列を置き換えます。インデックスは元の文字列を参照しているため、置換えをすることはできません。だから、私は文字数を数え上げましたが、よりよい方法が必要です。ルビで複数の部分文字列を一度にインデックスで置換する

res = original_string 
delta = 0 
# to keep things simple, assume replacements just contains objects which have start, end indices and replacements 
replacements.each do |r| 
    old_str = original_str[r.start_offset .. r.end_offset] 
    new_str = r.replacement 
    res[r.start_offset + delta .. r.end_offset + delta] = new_str 
    delta += new_str.size - old_str.size 
end 

答えて

5

最後から置き換えてください。インデックスは常に有効です:

# to keep things simple, assume replacements just contains 
# objects which have start, end indices and replacements 
replacements.sort_by(&:start_offset).reverse.each do |r| 
    string[r.start_offset..r.end_offset] = r.replacement  
end 
関連する問題