正则表达式 - 可以替换匹配组的一部分吗?

Regex - replacing part of a matched group possible?

是否可以替换匹配组中的一半或 x 个字符?

我收到了部分电子邮件捕获请求,因此 example123@abcdef.com 变成了 ***mple123@***def.com

如果@前后的字符都是3个字符长,我可以这样做,

([^|@]{0,3})([^]{0,3})

这完美地捕获了 123@abc.com,我可以用 ***@***.com 代替,但是如果它的每一端超过 3 个字符,例如 example123@abcdef.com 它变成 ******e123@abcdef.com

我能看到的另一种方式是捕获 @ 之前的所有内容,以及 . 之前的所有内容,但这不会是部分捕获。这可能吗?

您可以使用

sed -E 's/^[^@]{0,3}|(@)[^.]{0,3}/***/g'

详情

  • -E - 启用不需要太多转义的 POSIX ERE 语法
  • ^[^@]{0,3} - 在字符串
  • 开头出现除 @ 之外的任何字符零到三次
  • | - 或
  • (@) - 第 1 组:一个 @ 字符
  • [^.]{0,3} - 除 .
  • 之外的任何字符出现零到三次
  • *** 替换为第 1 组值 + ***.