Gsub liefert unterschiedliche Ergebnisse bei der Ausführung desselben Codes

Variablen wie $1 werden erst nach der Durchführung eines Regex-Matches befüllt. Vereinfacht man Ihr Beispiel etwas:

s.gsub('original(value)', "replacement#{$1}")

Der Ausdruck "replacement#{$1}" wird vor dem Aufruf der gsub-Funktion ausgewertet. Daher ist $1 der Rest einer vorherigen Regex-Aufgabe. (Das ist der Grund, warum Ihr zweiter Versuch funktioniert – er nimmt $1 aus dem ersten Versuch.)

Es gibt mehrere Möglichkeiten, dieses Problem zu lösen. gsub bietet zahlreiche verschiedene Funktionen.

Meine bevorzugte Methode ist die Übergabe eines Blocks an gsub. Der Block wird erst nach dem Regex-Match ausgewertet, sodass $1 wie erwartet funktioniert:

s.gsub('original(value)') { |match| "replacement#{$1}" }

Alternativ können Sie die „Backreference"-Funktion von gsub nutzen. Diese Syntax ist nicht mein Favorit, funktioniert aber. Anstatt "replacement#{$1}" verwenden Sie 'replacement\\1' (oder \\2, \\3 usw.):

s.gsub('original(value)', 'replacement\\1')