繁体   English   中英

使用正则表达式屏蔽域电子邮件地址

[英]Mask domain email address using regular expression

我的客户想通过以下方式屏蔽消息中的电子邮件:

原始电子邮件:

1 userone@domain.com

2 usertwo@domain.com.co --- > 可以是 gov.co, .com.mx .. 等

被屏蔽的电子邮件:

1 u*****e@d****n.com

2 u*****o@d****n.com.co

对于第一种情况,我有这个

string pattern = @"(?<=[\w]{1})[\w-\._\+%]*(?=[\w]{1}@)"; // ---> mask before "@"
string p2 = @"(?<=[\w]{1})[\w-\+%]*(?=[\w]{1}[.])"; // --- > mask after "@"
string result = Regex.Replace(mail, pattern, m => new string('*', m.Length));
string newresult = Regex.Replace(result, p2, m => new string('*', m.Length));
Console.WriteLine("Masked email: {0}", newresult);

并且工作正常:

MaskedEmail 第一种情况

但是......不适用于第二种情况......

那么,适用于 "@" 之后掩码的两种情况的正则表达式是什么?

原答案

请参阅我的答案底部的编辑,了解可以在 .net 中完成的第二种方法(更短)。

代码

请参阅此处使用的正则表达式

(?:(?:^|(?<=@))([^.@])|\G(?!\A))[^.@](?:([^.@])(?=[.@]))?

更换: $1*$2

用法

在此处查看正在使用的代码

using System;
using System.Text.RegularExpressions;
 
public class Example
{
    public static void Main()
    {
        string pattern = @"(?:(?:^|(?<=@))([^.@])|\G(?!\A))[^.@](?:([^.@])(?=[.@]))?";
        string substitution = @"$1*$2";
        string input = @"userone@domain.com
usertwo@domain.com.co";
        RegexOptions options = RegexOptions.Multiline;
 
        Regex regex = new Regex(pattern, options);
        Console.WriteLine(regex.Replace(input, substitution));
    }
}

结果

输入

userone@domain.com
usertwo@domain.com.co

输出

u*****e@d****n.com
u*****o@d****n.com.co

解释

  • (?:(?:^|(?<=@))([^.@])|\\G(?!\\A))匹配以下任意一项
    • (?:^|(?<=@))([^.@])匹配以下内容
      • (?:^|(?<=@))匹配以下任意一项
        • ^在行首断言位置
        • (?<=@)正向后视确保前面是 at 符号字符@字面意思
      • ([^.@])将列表中不存在的任何字符(除点号.或 at 符号@字符以外的任何字符)捕获到捕获组 1
    • \\G(?!\\A)在上一场比赛结束时断言位置
  • [^.@]匹配列表中不存在的任何字符(除点号之外的任何字符.或 at 符号@字符)
  • (?:([^.@])(?=[.@]))? 匹配以下零或一次
    • ([^.@])将列表中不存在的任何字符(除点号.或 at 符号@字符以外的任何字符)捕获到捕获组 2
    • (?=[.@])正向前瞻确保后面是一个点. 或在符号@字符字面上


编辑

此模式获得与我的原始答案相同的结果(除非给出长度为 2 的字符串: ie un@domain.com被保留,而原始答案将使此u*@domain.com )。

C# (.net) 支持可变长度的lookbehinds。 感谢@Gurman的评论。 他走在正确的轨道上,只是可能不知道 .net 支持可变长度的lookbehinds。

代码

请参阅此处使用的正则表达式

(?<=(?:^|@)[^.]*)\B.\B

解释

  • (?<=(?:^|@)[^.]*)正向后视确保后面的匹配
    • (?:^|@)匹配行断言的开头或符号@处的文字
    • [^.]*匹配除点字符以外的任何字符. 字面上地
  • \\B匹配单词边界不匹配的位置
  • . 匹配任何字符
  • \\B匹配单词边界不匹配的位置

编辑 2

包含电子邮件的正则表达式. 在本地部分(请参阅此处使用):

(?<=^[^@]+)[^@](?=[^@])|(?<=@[^.]+)[^.](?=[^.])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM