Is there way to replace n occurrences starting from the end of a string?

Let’s say you have:

foo = "fizz_buzz_fizz_buzz_fizz_buzz_fizz_buzz_fizz_buzz"

and you want to change the last two buzzes to bars:

nu_foo = "fizz_buzz_fizz_buzz_fizz_buzz_fizz_bar_fizz_bar"

What is the easiest way to do this with the least code.

For clarity, this would be the opposite of the current replace function with an limit count given:

julia> replace(foo, "buzz", "baz", 2)


In case nothing better is found, a rookery of reversions could do the trick

 reverse(replace(reverse(foo), reverse("buzz") => reverse("baz"), count=2))

I think this is the way to go, even if there’s a function for OP, probably would just be a wrapper

Yup, that’s the way to do it:

function rreplace(varargs...; kwargs...) 
    varargs = map(
        vararg -> isa(vararg, AbstractString) ? reverse(vararg) : vararg,

be careful:

julia> rreplace(foo, r"b.zz"=>"baz", count=2)

I’ll leave that as an exercise for the reader

Another option, more concise and efficient than the previous:

julia> join(rsplit(foo, "buzz", limit=3), "baz")

According to the documentation, this solution should also support regexes, but the code for that seems to be missing.

1 Like