【问题标题】:How to create a regex expression with this pattern?如何使用这种模式创建正则表达式?
【发布时间】:2021-08-22 01:14:48
【问题描述】:

有人知道我如何制作这种模式的正则表达式吗?

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

另一个例子是 3 个或更少的字母:

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

我尝试过这种方式,但仍然无法正常工作:

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

感谢您的帮助!

【问题讨论】:

  • 你有两个不同的问题——字符串匹配和字符串替换。你能更清楚地说明你对每个人都有什么吗?
  • 我想用上述模式屏蔽一封电子邮件,用正则表达式我想用 js 进行正则表达式替换。
  • 如果您使用任何合理的语言,您应该强烈考虑编写字符串切片代码来执行此转换。棘手的正则表达式和替换是现有代码中最令人困惑和最容易出错的部分。负责维护这件事的人(包括你未来的自己)会感谢你的。注意:您可以合理地使用捕获正则表达式来获取切片。

标签: regex regexp-replace


【解决方案1】:

当您将某些内容放在正则表达式的括号中时(例如:s/\(.\)\1/\1/g 您可以稍后使用 \1 到 \9 来匹配重复模式。这是我想出的正则表达式(大部分)符合标准:

s/\(.\)\1..\1\1@\(.\)\2.*\.com\.br/\1\1**\1\1@\2\2***.com.br/g。 我无法让它在末尾自动输入确切的星数,以便字符数仍然与原始电子邮件一致,但希望它仍然有帮助。

【讨论】:

    【解决方案2】:

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

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

    模式匹配

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

    Regex demo

    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);
    })

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 2021-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多