Атрибут длины вычисляется до замены $ 2, поэтому метод replace () не будет работать.Вызов функции, предложенный Августом, должен работать, другой подход будет использовать match () вместо replace ().
Использование match () без / g возвращает массив результатов совпадений, которые можно объединить, когда выОжидайте.
txt="==Hello==";
mat=txt.match(/(==)([^=]+)(==)/); // mat is now ["==Hello==","==","Hello","=="]
txt=mat[1]+Array(mat[2].length+1).join("~")+mat[3]; // txt is now "==~~~~~=="
Вы исключили начальный / конечный символ из среднего выражения, но если вы хотите большей гибкости, вы можете использовать это и обрабатывать все, что заключено в скобки с начальными / конечными литералами.
mat=txt.match(/(^==)(.+)(==$)/)