首页 > 解决方案 > Ruby - 仅匹配和替换电子邮件中的特定字符

问题描述

我有一个电子邮件地址xyz_abc@gmail.com,我想将其替换为xy****@gmail.com. 相同的标准如下:

  1. 将电子邮件中 ​​@ 符号之前的所有字符转换为 *。
  2. 将前 2 个字符保留为 @ 符号后替换字符。

同样,我编写了如下逻辑:

"xyz_abc@gmail.com".gsub(/\A[\w+\-.]+/, "*") 

输出为

"*@gmail.com"

实现我想要的一个可能的解决方案是用@拆分电子邮件地址并计算字符串前半部分的长度并替换为相同数量的(*)。但这不是最佳解决方案,因此需要一个直接匹配和替换的正则表达式。

预期输出

一个正则表达式,可以匹配和替换 @ 符号之前的字符,留下前 2 个字符,如下所示:

xy****@gmail.com

任何建议将不胜感激。

标签: regexrubypattern-matchingmatch

解决方案


您可以使用

s = s.gsub(/(?:\G(?!\A)|\A[^@]{2})\K[^@]/, '*')

或者,

s = s.gsub(/(?<=[^@]{2})[^@](?=[^@]*@)/, '*')

正则表达式匹配

  • (?:\G(?!\A)|\A[^@]{2})- 上一个成功匹配的结尾或字符串的开头以及除 a 之外的任何 2 个字符@
  • \K-匹配重置运算符,丢弃到目前为止匹配的文本
  • [^@]- 以外的字符@

第二个正则表达式匹配

  • (?<=[^@]{2})- 紧接在除 a 之外的任何两个字符之前的位置@
  • [^@]- a 以外的字符@
  • (?=[^@]*@)- 紧随其后的位置,后跟除 a@和 a之外的任何 0 个或多个字符@

推荐阅读