Заменить символы звездочками - replace

Нужно в логине емайла скрыть все символы звездочками кроме последней и первой.
Результат:

a**********[email protected].

Как исправить код?

var str = "[email protected]";
str = str.replace(/(\S{1})(\S+?)(?=[@])/g, function(a, b, c) {
  return b + c.replace(/./g, '*');
});
console.log(str); // a***********@domain.com


Ответы (3 шт):

Автор решения: Smoliarick
  • добавил в регулярное выражение (\S{1}) и переменную d в функцию, вроде работает корректно

var str = "[email protected]";
str = str.replace(/(\S{1})(\S+?)(\S{1})(?=[@])/g, function(a, b, c, d) {
    return b + c.replace(/./g, '*') + d;
});
console.log(str); // a***********[email protected]

→ Ссылка
Автор решения: Mike

Сразу меняем по 1 символу, без использования функций. Условия поиска символа для замены: Перед ним не должно быть начала строки ((?!^)), после него должен быть один и более символов, за которыми следует @ ((?=.+@)):

var str = "[email protected]";
str = str.replace(/(?!^).(?=.+@)/g, '*');
console.log(str);   // "a**********[email protected]"

Первым вариантом было: str.replace(/(?<=.).(?=.+@)/g, '*'); Проверялось не начало строки, а наличие одного символа перед тем, который будет меняться. Но по подсказке @Grundy этот вариант может работать не во всех браузерах, так как упреждающая проверка ?<= появилась в регулярных выражениях JS недавно.

→ Ссылка
Автор решения: Wiktor Stribiżew

Можно захватить в отдельные группы первый символ, всё, что после него до последнего символа перед @, затем символ перед последним @, а потом снова объединить захваченные строки, заменив вторую группу звёздочками с помощью метода String#repeat:

var str = '[email protected]';
console.log(
  str.replace(/^(.)(.*)(.)@/, (_,x,y,z) => `${x}${'*'.repeat(y.length)}${z}@`)
)

Подробности

  • ^ - начало строки
  • (.) - Группа №1: один символ, отличный от перевода строки
  • (.*) - Группа №2: ноль и более символов, отличных от перевода строки, как можно больше
  • (.) - Группа №3: один символ, отличный от перевода строки
  • @ - символ @
→ Ссылка