Заменить символы звездочками - 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 шт):
- добавил в регулярное выражение
(\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]
Сразу меняем по 1 символу, без использования функций. Условия поиска символа для замены: Перед ним не должно быть начала строки ((?!^)), после него должен быть один и более символов, за которыми следует @ ((?=.+@)):
var str = "[email protected]";
str = str.replace(/(?!^).(?=.+@)/g, '*');
console.log(str); // "a**********[email protected]"
Первым вариантом было: str.replace(/(?<=.).(?=.+@)/g, '*'); Проверялось не начало строки, а наличие одного символа перед тем, который будет меняться. Но по подсказке @Grundy этот вариант может работать не во всех браузерах, так как упреждающая проверка ?<= появилась в регулярных выражениях JS недавно.
Можно захватить в отдельные группы первый символ, всё, что после него до последнего символа перед @, затем символ перед последним @, а потом снова объединить захваченные строки, заменив вторую группу звёздочками с помощью метода String#repeat:
var str = '[email protected]';
console.log(
str.replace(/^(.)(.*)(.)@/, (_,x,y,z) => `${x}${'*'.repeat(y.length)}${z}@`)
)
Подробности
^- начало строки(.)- Группа №1: один символ, отличный от перевода строки(.*)- Группа №2: ноль и более символов, отличных от перевода строки, как можно больше(.)- Группа №3: один символ, отличный от перевода строки@- символ@