Assign to x2 the value of string x with the last occurrence of y replaced by z.
If y is not contained in x, then x2 has the same value as x.
New implementation

Be concise.

Be useful.

All contributions dictatorially edited by webmasters to match personal tastes.

Please do not paste any copyright violating material.

Please try to avoid dependencies to third-party libraries and frameworks.

Other implementations
var position = x.lastIndexOf(y).clamp(0, x.length);
var x2 = x.replaceFirst(y, z, position);
  character(len=:), allocatable :: x, x2, y, z

  k = index(x,y,back=.true.)
  if (k > 0) then
     x2 = x(1:k-1) // z // x(k+len(y):)
     x2 = x
  end if
import "strings"
func replaceLast(x, y, z string) (x2 string) {
	i := strings.LastIndex(x, y)
	if i == -1 {
		return x
	return x[:i] + z + x[i+len(y):]
  x2 := x;
  p := RPos(y, x);
  if (p > 0) then
    Delete(x2, p, Length(y));
    Insert(z, x2, p);
  x2 := ReverseString(StringReplace(ReverseString(x), ReverseString(y), ReverseString(z), []));
$x = 'A BB CCC this DDD EEEE this FFF';
$y = 'this';
$z = 'that';

$x2 = $x;
$pos = rindex $x, $y;
substr($x2, $pos, length($y)) = $z
    unless $pos == -1;

print $x2;
x2 = z.join(x.rsplit(y, 1))
x2 = x.gsub(/#{y}(?!.*#{y})/, z )