原始答案
请参见我的答案底部的编辑,了解在 .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))
匹配以下任一内容
(?:^|(?<=@))([^.@])
匹配以下内容
(?:^|(?<=@))
匹配以下任一内容
^
断言当前位置在行首
(?<=@)
正向先行断言,确保前面是字符@
([^.@])
捕获除了点号.
或者符号@
以外的任意字符到第一个捕获组
\G(?!\A)
断言当前位置在上一个匹配的结尾
[^.@]
匹配除了点号.
或者符号@
以外的任意字符
(?:([^.@])(?=[.@]))?
匹配以下内容零次或一次
([^.@])
捕获除了点号.
或者符号@
以外的任意字符到第二个捕获组
(?=[.@])
正向先行断言,确保后面是点号.
或者符号@
编辑
这个模式得到的结果与我的原始答案相同(除非给出长度为2的字符串:即un@domain.com
保持不变,而原始答案将使其成为u*@domain.com
)。
C# (.net)支持可变长度回溯。感谢@Gurman的评论。他走在了正确的轨道上,只是可能不知道.net支持可变长度回溯。
代码
在此处查看使用的正则表达式
(?<=(?:^|@)[^.]*)\B.\B
解释
(?<=(?:^|@)[^.]*)
正向后查找,确保后面的内容匹配
(?:^|@)
匹配行首或者字母符号 @
[^.]*
匹配除了句号 .
以外的任何字符
\B
匹配一个单词边界不匹配的位置
.
匹配任何字符
\B
匹配一个单词边界不匹配的位置
编辑2
包含.
的电子邮件本地部分的正则表达式(在此处使用):
(?<=^[^@]+)[^@](?=[^@])|(?<=@[^.]+)[^.](?=[^.])
\B.\B(?=\w*(?:@|\.com))
- Gurmanjot Singh