我的客户想通过以下方式屏蔽消息中的电子邮件:
原始电子邮件:
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);
Run Code Online (Sandbox Code Playgroud)
并且工作正常:
但是......不适用于第二种情况......
那么,适用于 "@" 之后掩码的两种情况的正则表达式是什么?
ctw*_*els 10
请参阅我的答案底部的编辑,了解可以在 .net 中完成的第二种方法(更短)。
(?:(?:^|(?<=@))([^.@])|\G(?!\A))[^.@](?:([^.@])(?=[.@]))?
Run Code Online (Sandbox Code Playgroud)
替代品: $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));
}
}
Run Code Online (Sandbox Code Playgroud)
userone@domain.com
usertwo@domain.com.co
Run Code Online (Sandbox Code Playgroud)
u*****e@d****n.com
u*****o@d****n.com.co
Run Code Online (Sandbox Code Playgroud)
(?:(?:^|(?<=@))([^.@])|\G(?!\A)) 匹配以下任何一项
(?:^|(?<=@))([^.@]) 和以下相符
(?:^|(?<=@)) 匹配以下任何一项
^ 在行首断言位置(?<=@)正回顾后保证什么之前是在符号字符@字面([^.@])将列表中不存在的任何字符(除了点.或 at 符号@字符以外的任何字符)捕获到捕获组 1\G(?!\A) 在上一场比赛结束时断言位置[^.@]匹配列表中不存在的任何字符(除了点.或 at 符号@字符之外的任何字符)(?:([^.@])(?=[.@]))? 匹配以下零或一次
([^.@])将列表中不存在的任何字符(除了点.或 at 符号@字符以外的任何字符)捕获到捕获组 2(?=[.@])正向前瞻确保.后面的@字符是点或符号字符此模式获得与我的原始答案相同的结果(除非给出了长度为 2 的字符串:i.e. un@domain.com单独留下,而原始答案将使 this u*@domain.com)。
C# (.net) 支持可变长度的lookbehinds。感谢@Gurman与他的评论。他走在正确的轨道上,只是可能不知道 .net 支持可变长度的lookbehinds。
(?<=(?:^|@)[^.]*)\B.\B
Run Code Online (Sandbox Code Playgroud)
(?<=(?:^|@)[^.]*) 积极的回顾确保后面的内容匹配
(?:^|@) 匹配行断言的开头或符号处的文字 @[^.]*.字面上匹配除点字符以外的任何字符\B 匹配单词边界不匹配的位置. 匹配任何字符\B 匹配单词边界不匹配的位置包含.在 localpart 中的电子邮件的正则表达式(请参阅此处使用):
(?<=^[^@]+)[^@](?=[^@])|(?<=@[^.]+)[^.](?=[^.])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2988 次 |
| 最近记录: |