Используя C #, вы можете использовать якорь \G
и группу захвата и использовать отрицательный символьный класс, чтобы не соответствовать символу пробела или @.
Используйте заглядывание, чтобы убедиться, что есть толькоодин символ @ присутствует.
\G([^\s@])[^\s@](?=[^\s@]*@[^\s@]+(?!\S))
\G
Утверждение позиции в конце предыдущего матча (в начале) ([^\s@])
Захват в группа 1 совпадение с любым символом, кроме символа пробела или @ [^\s@]
Совпадение не с символом пробела или @ (?=
Положительный взгляд вперед, утверждают, что справа - [^\s@]*@
Соответствует 0+ раз любому символу, кроме символа пробела или @, затем соответствует @ [^\s@]+
Соответствует 1+ раз любому символу, кроме символа пробела или @ (?!\S)
Отрицательный взгляд, утверждаем, что прямо справа - символ без пробелов
)
Закрыть положительный взгляд
При замене используйте
$1*
Regex demo | C # демо
![enter image description here](https://i.stack.imgur.com/HnJCm.png)
Например
string[] strings = { "File name without 3 digit end.jpg",
"username1@example.com",
"username@example.com",
"username1@example@example.com",
"username1@",
"test",
};
String pattern = @"\G([^\s@])[^\s@](?=[^\s@]*@[^\s@]+(?!\S))";
Regex regex = new Regex(pattern);
string substitution = @"$1*";
foreach(string str in strings)
{
Console.WriteLine(regex.Replace(str, substitution));
}
Выход
u*e*n*m*1@example.com
u*e*n*m*@example.com
username1@example@example.com
username1@
test