我有电子邮件,希望将首字母和@之间的每个字符替换为*。示例:
let h="john.smith@gmail.com".replace(/(.)(.*)@/,'$1*')
console.log(h);
这是我的代码,但是它只产生一颗星星,而不是一颗星星-我坚持使用它:
{{1}}
有解决方案吗?
答案 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+个字符,然后是@
。