将每个捕获的字符替换为*?

时间:2019-01-08 21:57:19

标签: javascript regex

我有电子邮件,希望将首字母和@之间的每个字符替换为*。示例:

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

console.log(h);

这是我的代码,但是它只产生一颗星星,而不是一颗星星-我坚持使用它:

{{1}}

有解决方案吗?

6 个答案:

答案 0 :(得分:5)

您可以使用replace的回调参数:

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

console.log(h);

答案 1 :(得分:3)

正则表达式中缺少的是全局标记。

我得到了oneshot正则表达式来完成这项工作:

"john.smith@gmail.com".replace(/(?!^)(?=.+@)./g,'*')
  • 负面看待排除第一个字符。
  • 积极期待@字符之前的所有字符。
  • 用于替换所有捕获的全局标记。

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

console.log(h);

答案 2 :(得分:2)

您可以在replacement function中传递String.prototype.replace,例如:

const result = 'john.smith@gmail.com'.replace(
    /^(.)(.*)(@.+)$/,
    (match, ...groups) => groups[0] + '*'.repeat(groups[1].length) + groups[2]
);
     
console.log(result);

答案 3 :(得分:2)

您的正则表达式将匹配整个部分并将其替换为星号。相反,您希望正则表达式能够分别匹配要匹配的每个字符。这将起作用:

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

要分解正则表达式:

(?<=^.+)将使用正向后缀匹配字符串的开头,第一个字符和之后的任意数量的字符。该概念将匹配字符串,但不会包含在结果匹配中。

(?<!@.*)后面有一个否定的含义,以确保我们在@符号后不匹配任何内容。

[^@]与非@的任何字符匹配。

g的末尾表示全局,这使它匹配任意次而不是一次。

答案 4 :(得分:2)

只需写作:

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)

答案 5 :(得分:1)

简单的正则表达式替换即可:

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

详细信息

  • (?!^)-不是字符串的开头
  • .-除换行符外的任何字符
  • (?=.*@)-在右边,除换行符外,必须有0+个字符,然后是@

请参见online regex demo