Логика, вероятно, была бы проще, если бы вы выполняли эти операции отдельно - сначала найдите числа с несколькими десятичными знаками и исправьте их так, чтобы они содержали только первое десятичное число, , а затем findповторяющиеся операторы и замените их конечным оператором:
const clean = str => str
// Match zero or more digits, followed by a decimal,
// followed by more digit and decimal characters
// For everything past the first decimal, replace decimals with the empty string
.replace(
/(\d*\.)([\d.]+)/g,
(_, g1, g2) => g1 + g2.replace(/\./g, '')
)
// Match 2 or more operators, capture the last operator in a group
// Replace with the last operator captured
.replace(
/([-+/*]){2,}/g,
'$1'
);
console.log(clean('..123+*/.4.3.5-+..3+123'));