Ваше регулярное выражение будет соответствовать всей части и заменить его звездочкой. Вместо этого вы хотите, чтобы регулярное выражение могло соответствовать каждому символу, который вы хотите сопоставить отдельно. Это будет работать:
let h="john.smith@gmail.com".replace(/(?<=^.+)(?<!@.*)[^@]/g,'*')
console.log(h);
Чтобы сломать регулярное выражение:
(?<=^.+)
будет соответствовать началу строки, первому символу и любому количеству символов после него с использованием положительного взгляда сзади. Эта концепция будет работать, чтобы соответствовать строке, но не будет включена в полученное совпадение.
(?<!@.*)
является отрицательным взглядом сзади, чтобы убедиться, что мы не сопоставляем ничего после символа @.
[^@]
соответствует любому символу, который не является @.
g
в конце означает глобальный, что позволяет ему соответствовать любое количество раз, а не только один раз.