Заменить каждый захваченный символ на *? - PullRequest
0 голосов
/ 09 января 2019

У меня есть электронная почта, и я хочу заменить каждый символ между первой буквой и @ на *. Пример:

john.smith@gmail.com   ->  j*********@gmail.com

Вот мой код, но он выдает одну звезду вместо многих - я остановился на ней:

let h="john.smith@gmail.com".replace(/(.)(.*)@/,'$1*') 

console.log(h);

Какие-нибудь решения?

Ответы [ 6 ]

0 голосов
/ 09 января 2019

Глобальный флаг - это то, что вам не хватает в вашем регулярном выражении.

У меня есть это регулярное выражение, которое делает работу:

"john.smith@gmail.com".replace(/(?!^)(?=.+@)./g,'*')
  • Отрицательный взгляд вперед, чтобы исключить первый символ.
  • Позитивный взгляд на все символы, предшествующие @ char.
  • Глобальный флаг для замены всех снимков.

let h = "john.smith@gmail.com".replace(/(?!^)(?=.+@)./g,'*');

console.log(h);
0 голосов
/ 09 января 2019

Простая замена регулярного выражения сделает:

let h="john.smith@gmail.com".replace(/(?!^).(?=.*@)/g, '*') 
console.log(h);

Детали

  • (?!^) - не начало строки
  • . - любой символ кроме символа перевода строки
  • (?=.*@) - сразу направо, должно быть 0+ символов, кроме символов разрыва строки, а затем @.

См. онлайн-демонстрацию регулярных выражений .

0 голосов
/ 09 января 2019

Просто пишу:

let e = Array.from("john.smith@gmail.com").reduce((arr, char, index) => arr.concat(arr.includes('@') || char === '@' ? char : index === 0 ? char : '*'), []).join('');

console.log(e)
0 голосов
/ 09 января 2019

Ваше регулярное выражение будет соответствовать всей части и заменить его звездочкой. Вместо этого вы хотите, чтобы регулярное выражение могло соответствовать каждому символу, который вы хотите сопоставить отдельно. Это будет работать:

let h="john.smith@gmail.com".replace(/(?<=^.+)(?<!@.*)[^@]/g,'*') 
    
console.log(h);

Чтобы сломать регулярное выражение:

(?<=^.+) будет соответствовать началу строки, первому символу и любому количеству символов после него с использованием положительного взгляда сзади. Эта концепция будет работать, чтобы соответствовать строке, но не будет включена в полученное совпадение.

(?<!@.*) является отрицательным взглядом сзади, чтобы убедиться, что мы не сопоставляем ничего после символа @.

[^@] соответствует любому символу, который не является @.

g в конце означает глобальный, что позволяет ему соответствовать любое количество раз, а не только один раз.

0 голосов
/ 09 января 2019

Вы можете использовать аргумент обратного вызова replace:

let h = "john.smith@gmail.com".replace(/(.)(.*)@/, (_, first, rest) =>
    first + "*".repeat(rest.length) + "@"
); 

console.log(h);
0 голосов
/ 09 января 2019

Вы можете передать функцию замены в String.prototype.replace , например:

const result = 'john.smith@gmail.com'.replace(
    /^(.)(.*)(@.+)$/,
    (match, ...groups) => groups[0] + '*'.repeat(groups[1].length) + groups[2]
);
     
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...