首页 > 解决方案 > 如何使用这种模式创建正则表达式?

问题描述

有人知道我怎样才能制作这种模式的正则表达式?

对于我的问题,输入示例为ggggggg@aaaaa.com.br,预期输出为gg***gg@aa***.com.br. 如您所见,@ 之前的字母只会被替换为 ,如果字符串超过 4 个字符,遵循模式gg**gg@,并且在 @ 之后的两个字母后跟 * 直到电子邮件提供商的末尾。

另一个例子是当有 3 个字母或更少时:

ggg@aaaaa.comg*g@aa***.com

我试图这样做,但它仍然无法正常工作:

regex = /(^.{2})(.*)(.{2})@(.{2})(?:(?=\.)(.*)|(\w+)(.*))/gm;

谢谢您的帮助!

标签: regexregexp-replace

解决方案


使用 JavaScript,您可以使用捕获组,并根据第 1 组和第 2 组中的字符数组成返回字符串。

([^\s@]+)@([^\s@.]+)(\.[^\s@]+)

模式匹配

  • ([^\s@]+)捕获组 1,匹配除@空格字符以外的任何字符 1 次以上
  • @匹配@
  • ([^\s@.]+)捕获组 2,匹配 1 次以上的任何字符,除了. @或 whitspace 字符
  • (\.[^\s@]+)捕获组 3,匹配单个点和电子邮件地址的其余部分

正则表达式演示

const regex = /([^\s@]+)@([^\s@.]+)(\.[^\s@]+)/;
const strings = [
  "ggggggg@aaaaa.com.br",
  "abcdefghijklmnop@aaaaa.com.br",
  "abc@aaaaa.com",
  "gg@aaaaa.com",
  "g@aaaaa.com",
  "@aaaaa.com",
];

strings.forEach(s => {
  let res = s.replace(regex, (_, g1, g2, g3) => {
    let first = g1;
    if (g1.length === 3) {
      first = `*${g1.charAt(1)}*`
    }
    if (g1.length > 3) {
      first = `**${g1.slice(2, -2)}**`
    }
    return `${first}@${'*'.repeat(g2.length)}${g3}`
  });
  console.log(res);
})


推荐阅读