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

时间:2016-05-10 20:21:12

标签: regex

假设我有一个电子邮件地址'abcdef @ gmail.com'。我想替换'a'和'f'之间的所有字符,所以结果看起来像'a **** f@gmail.com'。

尝试使用正则表达式执行此操作并替换

str.replace(/^(.*?)@/gi, '*');

但结果看起来像这样

*gmail.com

有办法做我需要的吗?

2 个答案:

答案 0 :(得分:2)

这不是您实际问题的答案,但我想向您提出质疑,即您的想法并不好。通过用相同数量的*替换内部字母,最好来显示电子邮件地址的长度。最好使用固定数量的* s。

你似乎在使用javascript,它没有lookbehind断言,在这种情况下捕获也可能更容易理解,所以我这样做是为了替换为常量的* s < / p>

str.replace(/^(.).*(.@)/, '$1***$2')

答案 1 :(得分:1)

我使用带有回调的replace,其中用户中间部分也可以替换为* s:

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, "*")只会用*替换任何字符。它只会在第2组完成。

您在评论中建议的正则表达式也应该有用。

/(?!^).(?=[^@]+@)/g匹配任何字符,但换行符不是第一个字符((?!^)),并且除了@之外还有一个以上的字符@

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