我的客户希望以这种方式屏蔽邮件中的电子邮件:
原始电子邮件:
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);
并且工作正常:
但......对第二种情况不起作用......
那么,在&#34; @&#34;之后适用于两种情况的正则表达式是什么? ?
答案 0 :(得分:3)
请参阅我的答案底部的编辑,了解在.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符号字符@
字面意思([^.@])
捕获列表中不存在的任何字符(除了点.
或符号@
字符之外的任何字符)到捕获组1 \G(?!\A)
在上一场比赛结束时断言位置[^.@]
匹配列表中不存在的任何字符(除了点.
或符号@
字符之外的任何字符)(?:([^.@])(?=[.@]))?
匹配以下零或一次
([^.@])
捕获列表中不存在的任何字符(除了点.
或符号@
字符之外的任何字符)到捕获组2 (?=[.@])
确保以下内容的正面预测是点.
或符号@
字符此模式获得与原始答案相同的结果(除非给出长度为2的字符串:i.e. un@domain.com
保留,而原始答案将使此u*@domain.com
)。
C#(。net)支持可变长度的lookbehinds。感谢@Gurman及其评论。他走在正确的轨道上,可能不知道.net支持可变长度的外观。
(?<=(?:^|@)[^.]*)\B.\B
(?<=(?:^|@)[^.]*)
确保后续匹配的正面观察
(?:^|@)
匹配行断言的开头或符号@
的文字[^.]*
匹配除点字符.
之外的任何字符\B
匹配字边界不匹配的位置.
匹配任何字符\B
匹配字边界不匹配的位置