用正则表达式替换两个字符串之间的字符

3
假设我有一个电子邮件地址,'abcdef@gmail.com'。我想替换'a'和'f'之间的所有字符,使结果看起来像'a****f@gmail.com'。
尝试使用正则表达式和替换来实现。
str.replace(/^(.*?)@/gi, '*');

但是结果看起来像这样:
*gmail.com

有没有方法可以满足我的需求?


尝试这个:^[a-zA-Z0-9!#$%'*+-/=?^_`{|}~](.*?).@ - mba12
这是我在Node.js中找到的一个完美解决方案,但使用了向前和向后查找。str.replace(/(?!^).(?=[^@]+@)/gi, '*') - Geuis
2个回答

2
这并不是对你实际问题的答案,但我想质疑你的想法并认为它不好。最好不要通过用相同数量的*替换内部字母来显示电子邮件地址的长度。最好使用固定数量的*
你似乎正在使用javascript,它没有向后查找断言,并且在这种情况下捕获可能更容易理解,因此我会这样做以用常数数量的*进行替换。
str.replace(/^(.).*(.@)/, '$1***$2')

1
谢谢,这实际上是一个非常好的想法,我正在使用它。不过,很抱歉我不能接受你对我的问题给出的答案。=) - Geuis

1
我会使用一个带有回调函数的 replace 方法,其中用户输入的中间部分也可以被替换为 *

var email = "abcdef@gmail.com";
document.write(email.replace(/^(.)(.*)(.@[^@]*)$/, function(m, g1, g2, g3) {
  return g1 +  g2.replace(/./g, "*") + g3;
}));

这里是“外部” /^(.)(.*)(.@[^@]*)$/ 正则表达式的工作方式:
  • ^ - 匹配字符串开头
  • (.) - 第1组:任何第一个字符
  • (.*) - 第2组:任何字符,直到最后一个 @ 字符之前
  • (.@[^@]*) - 第3组:倒数第二个 @ 前面的一个字符,然后是 @,然后是除了 @ 以外的任意 0+ 个字符,直到...
  • $ - 字符串结尾
.replace(/./g, "*") 只会将 Group 2 中的任何字符替换为 *
你在评论中提出的正则表达式也应该可以工作。

/(?!^).(?=[^@]+@)/g 匹配除了第一个字符((?!^))外,后面跟着一个或多个非 @ 字符和一个 @ 的任何字符,但不包括换行符。

var re = /(?!^).(?=[^@]+@)/g;
document.body.innerHTML = "fake@gmail.com".replace(re, "*");


有趣的方法。我会接受这个方案,因为你的解决方案适用于客户端和服务器端的JavaScript环境。我还发现了这个在Node中可用的正则表达式,但它使用了前后查找。str.replace(/(?!^).(?=[^@]+@)/gi, '*') - Geuis
(?!^).(?=[^@]+@)只使用了lookahead,并且可在JavaScript中运行。它匹配除换行符外的任何字符,但不包括第一个字符 ((?!^)),并且在该字符后面有一个或多个@ - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接