2016-05-16 8 views
-1

Es ist eine ähnliche Frage zu this one, d. H. Einen Start- und End-Index eines Teilstrings, ersetzen Sie es durch einen anderen String, aber ich möchte mehrere Teilstrings durch Indizes ersetzen. Ich kann nicht einfach Ketten ersetzen, da sich die Indizes auf die ursprüngliche Zeichenfolge beziehen. Also habe ich die Charaktere gezählt, aber es muss einen besseren Weg geben.Ersetzen Sie mehrere Teilstrings durch Indizes auf einmal in Ruby

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 

Antwort

5

Beginnen Sie einfach am Ende zu ersetzen. Dann sind die Indizes immer gültig:

# 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 
Verwandte Themen